Javascript глобальная переменная с 'var' и без 'var'
Возможный дубликат:
Разница между использованием var и не использованием var в JavaScript
Я понимаю, что я всегда должен использовать 'var' для определения локальной переменной в функции.
Когда я определяю глобальную функцию, какая разница между использованием 'var'?
Некоторые примеры кода, которые я вижу в Интернете,
var globalVar = something;
globalVar = something;
Какая разница?
Ответы
Ответ 1
Ну, разница в том, что технически простое присваивание как globalVar = 'something';
не объявляет переменную, это присваивание просто создает свойство для глобального объекта, и тот факт, что глобальный объект является последним объектом в цепочке областей видимости, делает его разрешимым.
Другим отличием является способ привязки, переменные привязаны как "не подлежащие удалению" свойства его записи среды, например:
var global1 = 'foo';
delete this.global1; // false
global2 = 'bar';
delete this.global2; // true
Я бы настоятельно рекомендовал вам всегда использовать инструкцию var
, ваш код, например, будет разбит в соответствии с строгим режимом ECMAScript 5, присвоения незаявленным идентификаторам запрещены, чтобы избежать неявных глобальных привязок.
Ответ 2
Короткие: нет никакой разницы в глобальном контексте **.
Long: объект Variable для глобального контекста - это сам глобальный контекст. Вот почему мы можем просто получить доступ к глобальным variables
и methods
в контексте функции или eval. Однако оператор var
просто гарантирует, что вы определяете переменную в текущем контексте, поэтому не имеет значения, опуская это в глобальном контексте. Исключение: строгий режим ES5, вероятно, вызовет ошибку, если он увидит объявление без var
.
**
единственное отличие состоит в том, что var
объявит переменную без определения в текущем (исполняемом) контексте. Это происходит в js parse time, поэтому движок знает, что есть переменная с этим именем, доступным в контексте. Опускание var
приведет к прямому доступу к свойствам из global object
.
Ответ 3
Вне любой функции в браузере нет разницы между использованием var
или нет в отношении области видимости. В обоих ваших примерах globalVar
является членом window
.
Как правило, хорошей практикой не обладать такими переменными, так что глобальное пространство имен не будет загромождать.