声明无var关键字的variables

在w3schools有写:

如果你声明一个variables,而不使用“var”,variables总是变成GLOBAL。

在函数内部声明全局variables是否有用? 我可以想象在一些事件处理程序中声明一些全局variables,但是它有什么好处呢? 更好的使用内存?

全局variables是一个坏主意。 只有在绝对必要时才能使用它们。 没有RAM的好处或者类似的东西。

什么学校在谈论隐性全球恐怖 。 考虑这个function:

function foo() { var x; x = 5; y = 6; return x + y; } 

当你运行这个函数的时候,你突然之间有一个叫做y的全局variables。 这是因为函数赋值给y ,但是y没有在任何地方声明。 通过JavaScript中的作用域链的机制,这最终成为全局对象 (可以作为浏览器上的window访问)的属性的隐式赋值。 例如,假设y在任何包含范围内都没有被声明,这和这个完全一样:

 function foo() { var x; x = 5; window.y = 6; return x + window.y; } 

全局对象包含所有全局variables(更新:它曾经 ,ES6增加了一种方法来声明全局variables,这些variables不会在window ,参见下面的注释) ,都是显式的和隐式的。 你可以想象有很多全球variables是由人们的代码意外创build的。

全球对象已经非常非常混乱。 除非你正在编写一个库或者一个必须使用多个脚本文件的页面,否则没有理由进一步混淆全局对象。 只需定义一个很好的范围函数,并将其中的符号:

 (function() { var your, symbols, here, if_they_need, to_be_shared, amongst_functions; function doSomething() { } function doSomethingElse() { } })(); 

如果你这样做,你可能会想要调用JavaScript的新的严格模式 ,在第5版规范中添加:

 (function() { "use strict"; var your, symbols, here, if_they_need, to_be_shared, amongst_functions; function doSomething() { } function doSomethingElse() { } })(); 

…具有( 除其他之外 )使foo函数隐式创build全局variablesReferenceError的优点。


更新:ES6和全局variables:从ES6开始,创build了一种新的全局variables,它不是全局对象的属性:通过letconstclass创build的全局variables。 这些新的关键字在全局范围使用时会创build全局对象,这些全局对象不会成为全局对象的属性,因此无法通过浏览器上的window进行访问。

副作用忘记变种

隐含的全局variables和明确定义的variables之间有一点区别。 区别在于使用delete操作符取消定义这些variables的能力:

•用var创build的全局(在任何函数之外的程序中创build的)都不能被删除。

•无var创build的隐含全局(不pipe是否在函数内部创build)都可以被删除。

这表明隐含的全局variables在技术上不是实际variables,而是全局对象的属性。 可以使用删除操作删除属性,而variables不能:

 // define three globals var global_var = 1; global_novar = 2; // antipattern (function () { global_fromfunc = 3; // antipattern }()); // attempt to delete delete global_var; // false delete global_novar; // true delete global_fromfunc; // true // test the deletion typeof global_var; // "number" typeof global_novar; // "undefined" typeof global_fromfunc; // "undefined" 

在ES5严格模式下,对未声明的variables(例如上面代码片段中的两个反模式)的赋值将会引发错误。

JavaScript模式,作者Stoyan Stefanov(O'Reilly)。 版权所有2010雅虎公司,9780596806750。

全局variables的唯一用途是如果你需要全局访问它们。 在这种情况下,你应该在函数之外使用var关键字来声明它们,说明你真的想创build全局variables,而不是在声明局部variables时忘记var

一般来说,您应该尝试对您的代码进行范围化,以便在全局范围内尽可能less地使用。 您在脚本中使用的全局variables越less,您可以将其与另一个脚本一起使用。

通常,函数中的variables应该是本地的,以便在退出函数时它们会消失。

有时在函数内创build新的全局可访问的属性是有用的,这些属性稍后可以通过引用窗口对象(所有全局声明的属性附加到窗口对象)轻松访问。

然而,因为通常声明任何东西都是全局可访问的,所以以后可能会导致问题,因为这些属性可以很容易地被覆盖等。它只是简单地将值作为parameter passing给函数并检索其结果。

主要的问题是别人可能已经在使用同名的全局。

那么当你改变全局的值时,你会覆盖它的值。

之后当全球下一次使用它将会神秘地改变。