При объявлении переменных в Javascript, хотя использование ключевого слова var и его неиспользование часто не вызывают проблем при выполнении, между этими двумя способами всё же есть различия. Код, который работает нормально, не обязательно является подходящим кодом.

var num = 1;

Он объявляет переменную в текущей области видимости. Если объявлена в методе, это локальная переменная; если объявлена в глобальной области видимости, это глобальная переменная.

и

num = 1;

Фактически это операция присваивания свойству. Сначала он попытается найти num в текущей цепочке областей видимости (если объявлено в методе, текущая цепочка областей видимости представляет глобальную область видимости и локальную область видимости метода и т. д...). Если num найден в какой-либо текущей цепочке областей видимости, он выполнит присваивание свойству num. Если num не найден, он создаст свойство num в глобальном объекте (то есть в объекте верхнего уровня текущей цепочки областей видимости, таком как объект window) и присвоит ему значение.

Обратите внимание! Он не объявляет глобальную переменную, а создаёт свойство глобального объекта.

Даже в этом случае вам всё ещё может быть трудно понять разницу между "объявлением переменной" и "созданием свойства объекта" здесь. Фактически, объявления переменных Javascript, создание свойств и каждое свойство в Javascript имеют определённые флаги, описывающие их атрибуты, такие как ReadOnly, DontEnum, DontDelete и т. д.

Поскольку объявления переменных обладают неудаляемым атрибутом, сравните var num = 1 и num = 1. Первое — объявление переменной, которое обладает неудаляемым атрибутом, поэтому его нельзя удалить; второе — свойство глобального объекта, поэтому его можно удалить из глобального объекта.

// num1为全局变量,num2为window的一个属性
var num1 = 1;
num2 = 2;
// delete num1;  无法删除
// delete num2;  删除
function model(){
var num1 = 1; // 本地变量
num2 = 2;     // window的属性
    // 匿名函数
    (function(){
        var num = 1; // 本地变量
        num1 = 2; // 继承作用域(闭包)
        num3 = 3; // window的属性
    }())
}

PS: В стандарте ECMAScript5 существует «строгий режим». В строгом режиме присваивание значения необъявленному идентификатору вызовет ошибку ссылки, тем самым предотвращая случайное создание свойств глобального объекта. В настоящее время новые версии некоторых браузеров уже поддерживают его.