如何在javascript中正确声明全局变量

How to declare global variables in javascript the right way?

本文关键字:声明 全局变量 javascript      更新时间:2023-09-26

检查我遇到的一个使用此代码的网站;

if (!window.homePosition) window.homePosition = $('#sticky-container').offset().top;

用这两种方式声明全局变量有什么区别吗?

window.homePosition = 400;

var homePosition = 400;

你认为以前的开发人员为什么使用这种符号?

是的,有两个不同之处,尽管在实践中它们通常不是很大。

你有3个语句

var a=0;

…在变量对象上为全局执行上下文创建一个变量,这是全局对象,在浏览器上别名为window(并且是一个DOM窗口对象,而不是像在非浏览器实现中那样只是一个通用对象)。符号window本身实际上是全局(窗口)对象的一个属性,它用来指向自己。

所有这些的结果是:它在window上创建了一个不能删除的属性。它也是在第一行代码运行之前定义的(参见下面的"当var发生时")。

请注意,在IE8和更早的版本中,window上创建的属性不是可枚举的(在for..in语句中没有显示)。在IE9、Chrome、Firefox和Opera中,它是可枚举的。


a=0;

…隐式地在window对象上创建一个属性。因为它是一个普通属性,你可以删除它。我建议不要这样做,这会让以后阅读代码的人看不清。

有趣的是,在IE8和更早的版本上,创建的属性不是enumerable(在for..in语句中没有显示)。这很奇怪,特别是考虑到以下内容。
window.a=0;

…显式地在window对象上创建一个属性。因为它是一个普通的属性,你可以删除它。

这个属性可枚举的,在IE8和更早的版本,以及我尝试过的所有其他浏览器。

在函数内部的代码中,创建全局变量的唯一方法是在全局对象上创建一个属性(在浏览器中,该属性为window)。

许多代码,特别是库,但通常是编写良好的代码,将被封装在一个函数中,以明确的目的是避免创建全局符号:

(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中以正确的方式声明全局变量。"使用隐式全局属性创建绝对不是正确的方式。在"严格"模式下—所有新编写的代码都应该使用—