Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以正确的方式在javascript中声明全局变量?_Javascript - Fatal编程技术网

如何以正确的方式在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)对象的一个属性,它用来指向自身

结果是:它在
窗口
上创建了一个不能删除的属性。它也是在第一行代码运行之前定义的(请参阅下面的“When
var
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;