3

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

为了使这些变量可以从其他源文件访问并避免删除死代码,我必须“导出”它们。请参阅高级编译和外部

因此,不要使用这种语法声明变量:

var fooMinValue = 10;

我打算使用这种语法:

 window['fooMinValue'] = 10;

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

4

3 回答 3

2

虽然两者都是全局对象的属性,但还是有区别的:当你用 声明变量时var,它的[[Configurable]]内部属性被设置为falseObject.defineProperty因此,不能用(除了)来改变它的属性[[Value]]。最显着的效果是此类变量不能为deleted:

​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'
于 2012-10-26T17:33:32.927 回答
1

除了如果您的脚本未在浏览器上运行,则该窗口很可能未定义。

不客气!

于 2012-10-26T17:28:56.187 回答
1

它会起作用;这是完全有效的语法;它在 IE6 及更高版本中受支持。

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

于 2012-10-26T17:29:39.813 回答