При объявлении переменных в 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 существует «строгий режим». В строгом режиме присваивание значения необъявленному идентификатору вызовет ошибку ссылки, тем самым предотвращая случайное создание свойств глобального объекта. В настоящее время новые версии некоторых браузеров уже поддерживают его.