Синтаксис объявления глобальных переменных JavaScript
Я пишу библиотеку Javascript, которую надеюсь минимизировать с помощью опции ADVANCED_OPTIMIZATIONS компилятора Closure. Библиотека содержит около двух десятков глобальных переменных, которые устанавливают нижние и верхние границы диапазона, строковые литералы и т. д.
Чтобы сделать эти переменные доступными из других исходных файлов и избежать удаления мертвого кода, я должен "экспортировать" их. См. Расширенная компиляция и экстерны .
Поэтому вместо объявления переменных с этим синтаксис:
var fooMinValue = 10;
Я планирую использовать следующий синтаксис:
window['fooMinValue'] = 10;
Я проверил это, и, кажется, это работает нормально. Мои вопросы таковы: есть ли какой-либо недостаток в использовании этого синтаксиса и поддерживается ли он во всех браузерах, выпущенных начиная с IE 6? (Или я должен использовать совершенно другую технику?)
3 ответа:
Хотя оба являются свойствами глобального объекта, есть разница: когда вы объявляете переменную с
var
, ее[[Configurable]]
внутренний атрибут получает значениеfalse
. Таким образом, невозможно изменить его атрибуты с помощьюObject.defineProperty
(кроме[[Value]]
). Наиболее заметным эффектом является то, что такие переменные не могут бытьdelete
Д:var foo = 'bar'; window['bar'] = 'baz'; console.log(foo); // 'bar' console.log(bar); // 'baz' delete foo; // doesn't work, you can't delete vars delete bar; // works, bar is an object property console.log(foo); // 'bar' console.log(bar); // ReferenceError
Кроме того, при назначении переменной свойству вы делаете копию значения вместо ссылки на переменную. Этот означает, что внешние изменения свойства не влияют на значение переменной.
(function() { var foo = 'bar'; window['foo2'] = foo; //export foo console.log(foo); // will output 'bar' setTimeout(function() { console.log(foo) }, 1000); //will output 'bar' })(); window['foo2'] = 'baz'; console.log(window['foo2']); // will output 'baz'
Приведенный выше код выдаст следующий результат:
'bar' 'baz' 'bar'
Это то же самое, за исключением того, что если ваш скрипт не работает в браузере, то очень вероятно, что окно будет неопределенным.
Добро пожаловать!