声明无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,它不是全局对象的属性:通过let
, const
或class
创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给函数并检索其结果。
主要的问题是别人可能已经在使用同名的全局。
那么当你改变全局的值时,你会覆盖它的值。
之后当全球下一次使用它将会神秘地改变。