Синтаксис объявления глобальных переменных JavaScript


Я пишу библиотеку Javascript, которую надеюсь минимизировать с помощью опции ADVANCED_OPTIMIZATIONS компилятора Closure. Библиотека содержит около двух десятков глобальных переменных, которые устанавливают нижние и верхние границы диапазона, строковые литералы и т. д.

Чтобы сделать эти переменные доступными из других исходных файлов и избежать удаления мертвого кода, я должен "экспортировать" их. См. Расширенная компиляция и экстерны .

Поэтому вместо объявления переменных с этим синтаксис:

var fooMinValue = 10;

Я планирую использовать следующий синтаксис:

 window['fooMinValue'] = 10;

Я проверил это, и, кажется, это работает нормально. Мои вопросы таковы: есть ли какой-либо недостаток в использовании этого синтаксиса и поддерживается ли он во всех браузерах, выпущенных начиная с IE 6? (Или я должен использовать совершенно другую технику?)

3 3

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'

Это то же самое, за исключением того, что если ваш скрипт не работает в браузере, то очень вероятно, что окно будет неопределенным.

Добро пожаловать!

Он будет работать; это совершенно правильный синтаксис; и он поддерживается в IE6 и выше.

Демо: http://ie6test.it/?url=http://jsbin.com/usafeg/2