如何以正确的方式在javascript中声明全局变量?
检查我使用此代码访问的网站如何以正确的方式在javascript中声明全局变量?,javascript,Javascript,检查我使用此代码访问的网站 if (!window.homePosition) window.homePosition = $('#sticky-container').offset().top; 用这两种方法声明全局变量有什么不同吗 window.homePosition = 400; 或 您认为以前的开发人员为什么使用这种表示法?从函数内部的代码中,创建全局变量的唯一方法是在全局对象上创建一个属性(在浏览器中,它是窗口) 许多代码(尤其是库代码,但通常编写良好的代码)将封装在函数中,以避
if (!window.homePosition) window.homePosition = $('#sticky-container').offset().top;
用这两种方法声明全局变量有什么不同吗
window.homePosition = 400;
或
您认为以前的开发人员为什么使用这种表示法?从函数内部的代码中,创建全局变量的唯一方法是在全局对象上创建一个属性(在浏览器中,它是
窗口
)
许多代码(尤其是库代码,但通常编写良好的代码)将封装在函数中,以避免创建全局符号:
(function() {
"use strict";
// lots of code here
})();
在这样的代码中,如果希望导出全局符号,方法是创建全局上下文的属性:
(function() {
"use strict";
// lots of code here
window.something = valueToExport;
})();
通常,编写此类封装函数时,可以使用全局上下文引用的本地副本:
(function(global) {
"use strict";
// lots of code here
global.something = valueToExport;
})(this);
这是因为在实际的全局上下文(封装函数运行的地方)中,this
的值是对该上下文的引用(浏览器中的window
)。在上面的示例中,参数global
将是全局上下文对象的局部引用
编辑-如果没有“严格”模式,对赋值左侧未声明符号的引用将创建一个全局符号。本页的问题是,“如何在JavaScript中以正确的方式声明全局变量。”使用隐式全局属性创建肯定不是正确的方式。在所有新编写的代码都应该使用的“严格”模式下,这是一个错误。是的,有两个区别,尽管在实际应用中它们通常不是很大的区别 你有3个陈述 …在全局执行上下文的变量对象上创建一个变量,该变量是全局对象,在浏览器上别名为
window
(在非浏览器实现上是DOM窗口对象,而不仅仅是通用对象)。符号window
本身实际上是全局(window)对象的一个属性,它用来指向自身
结果是:它在窗口
上创建了一个不能删除的属性。它也是在第一行代码运行之前定义的(请参阅下面的“Whenvar
ockes”)
请注意,在IE8及更早版本中,在窗口中创建的属性不可枚举(不显示在for..in
语句中)。在IE9、Chrome、Firefox和Opera中,它是可枚举的
…在窗口
对象上隐式创建属性。因为它是普通属性,所以可以删除它。我建议不要这样做,以后阅读您的代码的人可能不清楚
有趣的是,同样在IE8和更早版本中,创建的属性不可枚举(不显示在for..in
语句中)。这很奇怪,特别是考虑到以下情况
…在窗口
对象上显式创建属性。因为它是普通属性,所以可以删除它
此属性在IE8和更早版本以及我尝试过的所有其他浏览器上都是可枚举的。如果(typeof window.homePosition=='undefined')
而不是如果(!window.homePosition)
@techfoobar yes,虽然如果代码知道它应该是一个对象引用,那么这可能没问题。当然,我们对所讨论的代码知之甚少。@Pointy-当然。我指的是代码检查是否已经定义(而不是自己定义)的情况。否则,是的。代码被封装在一个非常小的函数中,该函数在窗口滚动时被触发。函数在全局范围内。您的第一句话不正确。@mb21以什么方式不正确?如何从函数内部创建全局变量?编辑啊,通过隐式引用——这在“严格”模式下是错误的,在任何情况下都是一种非常糟糕的做法@mb21大体上我同意,但我们正在回答一个关于“正确方式”的问题。我认为所有的答案都非常有用,对我非常有用。但我发现这是最深入的解释,而且复杂性并没有妨碍我的理解
(function(global) {
"use strict";
// lots of code here
global.something = valueToExport;
})(this);
var a=0;
a=0;
window.a=0;