JavaScript全局变量声明语法

JavaScript全局变量声明语法,javascript,global-variables,minify,google-closure-compiler,Javascript,Global Variables,Minify,Google Closure Compiler,我正在编写一个Javascript库,希望能够使用闭包编译器的ADVANCED_OPTIMIZATIONS选项缩小该库。该库可能有24个全局变量,用于设置下限和上限、字符串文本等 为了使这些变量可以从其他源文件访问,并避免删除死代码,我必须“导出”它们。看 因此,不要使用此语法声明变量: var fooMinValue = 10; window['fooMinValue'] = 10; 我计划使用以下语法: var fooMinValue = 10; window['fooMinVal

我正在编写一个Javascript库,希望能够使用闭包编译器的ADVANCED_OPTIMIZATIONS选项缩小该库。该库可能有24个全局变量,用于设置下限和上限、字符串文本等

为了使这些变量可以从其他源文件访问,并避免删除死代码,我必须“导出”它们。看

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

var fooMinValue = 10;
 window['fooMinValue'] = 10;
我计划使用以下语法:

var fooMinValue = 10;
 window['fooMinValue'] = 10;

我已经测试过了,它似乎工作得很好。我的问题是,使用这种语法有什么缺点吗?自从IE6发布以来,所有浏览器都支持这种语法吗?(或者我应该使用完全不同的技术吗?

这是相同的,只是如果脚本未在浏览器上运行,则很可能窗口未定义


不客气

它会起作用;这是非常有效的语法;它在IE6及更高版本中得到支持


演示:

尽管这两个都是全局对象的属性,但有一点不同:当您使用
var
声明变量时,它会被设置为
false
。因此,无法使用更改其属性(除了
[[Value]]]
)。最显著的影响是这些变量不能被d:

此外,将变量指定给特性时,可以复制该值,而不是引用该变量。这意味着对属性的外部更改不会影响变量的值

(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'

在这种情况下,
这个['fooMinValue']=10
通常可以正常工作。或者,您可以将全局范围传递到如下函数中:
~function(window){window…}(this)
在全局代码中,您可以使用
访问全局对象。此外,如果您的名字是字母数字,则不需要括号表示法:
this.fooMinValue=10
@ŠimeVidas FYI:Closure为此语法生成以下警告
this.fooMinValue=10JSC_使用了_GLOBAL_THIS:在第30行字符0 THIS.fooMinValue=10;处危险地使用全局THIS对象;。无论如何,在这种情况下我不能使用
this
,因为变量没有括在引号中,所以闭包会重命名它。(对我来说)有用的评论,尽管如此。嗯,我不确定使用全局
这个
有什么危险。。。考虑这个模式:<代码>(函数(根){root([ FooMaunue')=10;}(this));
因此您将全局对象捕获到
参数中,然后使用该参数设置全局属性。这样,您仍然可以不知道如何访问全局对象(您不依赖于
窗口
)。@ŠimeVidas我在查看编译器警告时遇到了这个问题。“它是作为全局对象的属性创建的(不是实际变量)”-这两个属性并不相互排斥。全局变量也是全局属性。全局属性集是全局变量集的超集。(你的回答意味着全局变量不是全局属性。)@ŠimeVidas这一直让我困惑,但帮助我澄清。然而,我仍然找不到一种简单的方法来解释这一点(比如一个适合这个答案的短句)。另外,由于它与闭包编译器有关,您将导出一个值的副本,而不是对变量的引用。您可以读取该值,但外部更改实际上不会影响变量值。如果这不是您想要的,则需要将这些变量导出为对象的属性。有关详细信息,请参见
@expose
注释。@Karl我不知道闭包编译器如何解释该序列,但我可以告诉您如何在浏览器中计算该序列。因此,
var fooMinValue=10创建一个
“fooMinValue”
全局属性。现在,
window['fooMinValue']=fooMinValue将该属性的值指定给同一属性。因此,它是不可操作的(不一定是不可操作的,因为该属性可能是getter/setter,在这种情况下,getter/setter函数可能会有副作用。)@Karl Yes-如果将其创建为属性,则将使用引用并进行双向更新。只需确保一致地引用它(作为
窗口
对象上的属性,而不是全局变量)。