JavaScript全局变量声明语法
我正在编写一个Javascript库,希望能够使用闭包编译器的ADVANCED_OPTIMIZATIONS选项缩小该库。该库可能有24个全局变量,用于设置下限和上限、字符串文本等 为了使这些变量可以从其他源文件访问,并避免删除死代码,我必须“导出”它们。看 因此,不要使用此语法声明变量: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
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=10代码>JSC_使用了_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-如果将其创建为属性,则将使用引用并进行双向更新。只需确保一致地引用它(作为窗口
对象上的属性,而不是全局变量)。