我正在编写一个Javascript库,希望能够使用Closure Compiler的ADVANCED_OPTIMIZATIONS选项缩小。该库可能有二十多个全局变量,它们设置了下限和上限范围,字符串文字等。
要使这些变量可以从其他源文件访问并避免死代码删除,我必须“导出”它们。请参阅Advanced Compilation and Externs。
因此,不要使用以下语法声明变量:
var fooMinValue = 10;
我打算使用这种语法:
window['fooMinValue'] = 10;
我已经测试了这个,似乎工作正常。我的问题是,使用这种语法是否有任何缺点,并且自IE 6以来发布的所有浏览器都支持它吗? (或者我应该完全使用完全不同的技术?)
答案 0 :(得分:2)
虽然两者都是全局对象的属性,但有一点不同:当您使用var
声明变量时,其[[Configurable]]
internal attribute会设置为false
。因此,无法使用Object.defineProperty
更改其属性([[Value]]
除外)。最显着的影响是这些变量不能是delete
d:
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
此外,在为属性分配变量时,您可以对该值进行COPY而不是引用该变量。这意味着对属性的外部更改不会影响变量的值。
(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'
答案 1 :(得分:1)
除了如果你的脚本没有在浏览器上运行之外,它很可能是未定义的窗口。
欢迎你!
答案 2 :(得分:1)
它会起作用;它是完全有效的语法;它在IE6及以上版本中得到支持。