如何在javascript中正确声明全局变量
How to declare global variables in javascript the right way?
检查我遇到的一个使用此代码的网站;
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
对象上创建一个属性。因为它是一个普通属性,你可以删除它。我建议不要这样做,这会让以后阅读代码的人看不清。
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中以正确的方式声明全局变量。"使用隐式全局属性创建绝对不是正确的方式。在"严格"模式下—所有新编写的代码都应该使用—
- 如何将变量声明为全局变量
- 如何将变量声明为全局变量?用case foreach?Javascript
- 返回语句后的函数声明全局变量不会被覆盖
- 为什么Javascript代码打印'未定义'即使变量被声明为全局变量
- JavaScript 全局变量声明
- 如何从选择菜单选项动态声明全局变量
- 让 javascript 将(默认情况下)未声明的变量声明到当前本地范围(基于首次使用)而不是全局范围
- 声明全局变量
- 由全局范围内的 Web 应用程序声明的全局变量
- 是否有任何选项可以在煎茶触摸中声明全局变量
- 如何将值从一个函数传递到另一个具有对象的函数,而无需在 JS 中声明全局变量
- 如何在不声明全局变量的情况下将值从一个函数传递到另一个函数?
- 如何从函数内部声明全局变量
- 在页面初始化时声明全局变量
- 如何在javascript中正确声明全局变量
- 是否可以在Node/Express 4.0中声明全局变量?
- Javascript:在一个脚本中声明全局变量,并在另一个脚本中使用它
- 如何使用JS声明全局变量
- 在 .js 文件中声明全局变量是否不好
- 如何在外部js文件中声明全局变量?