JavaScript全局变量声明语法

时间:2012-10-26 17:23:53

标签: javascript global-variables minify google-closure-compiler

我正在编写一个Javascript库,希望能够使用Closure Compiler的ADVANCED_OPTIMIZATIONS选项缩小。该库可能有二十多个全局变量,它们设置了下限和上限范围,字符串文字等。

要使这些变量可以从其他源文件访问并避免死代码删除,我必须“导出”它们。请参阅Advanced Compilation and Externs

因此,不要使用以下语法声明变量:

var fooMinValue = 10;

我打算使用这种语法:

 window['fooMinValue'] = 10;

我已经测试了这个,似乎工作正常。我的问题是,使用这种语法是否有任何缺点,并且自IE 6以来发布的所有浏览器都支持它吗? (或者我应该完全使用完全不同的技术?)

3 个答案:

答案 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及以上版本中得到支持。

演示:http://ie6test.it/?url=http://jsbin.com/usafeg/2