几乎所有的javascript书都说
总是使用var关键字 声明变量,因为没有 var,变量将声明为 全局变量。
那么,为什么不删除var关键字,将默认声明作为本地范围? 像Python一样,如果你想使用全局变量,你可以写:
global foo;
我们几乎所有时间都使用局部变量,不是吗?
有充分的理由吗?
谢谢你的帮助。
编辑: 感谢您的所有帮助,我认为必须有一个很好的理由表明使用var更好,所以我没有尝试改变它的语言。
答案 0 :(得分:6)
var globalInt = 5;
function Hello()
{
// Hey, give me back my var keyword!
// I want to assign a global existing variable
globalInt = 7;
}
另一点是,没有简单的方法可以从JavaScript中删除。每个功能(甚至黑客)已经在数千个网站上使用,删除功能将破坏这些网站。 JavaScript只能扩展。或者应该创建新的JS,它与以前的版本不兼容。
答案 1 :(得分:4)
function A() {
var foo; // variable in the scope of function A
function B() {
foo; // variable still in the scope of function A
}
}
如果选择的是“最窄范围”或“全球范围”,那么这是不可能的。
答案 2 :(得分:3)
这就是语言的设计方式。如果变量是自动分配的,则在全局范围内分配。
如果你考虑它会很有意义。应该在哪个范围内分配变量?编译器无法通过显式声明来了解程序员的目标
无论好坏,JS的设计都是这样的。我认为允许变量自动声明是一个错误,但鉴于它存在于JS中,因为JS没有块级范围,所以将它们设置为全局是有意义的。
答案 3 :(得分:1)
在函数内使用var关键字在本地范围内声明变量,从而防止覆盖任何全局变量。想法是安全的,并使用var。如果您知道自己在做什么(100%确定您不会覆盖任何全局变量),请随意丢弃var。
答案 4 :(得分:1)
好的,我会尝试解释它是如何再次运作的。有一个ECMAScript的Global
对象,它是其他所有东西的“根”。在浏览器window
中,对象实现Global
。所以:
function assert( condition, message ) {
if ( !condition )
if ( typeof message != 'undefined' ) alert( message );
else alert( 'Free Consulting just talks rubbish' );
}
// assuming global scope
assert( this == window, 'noes!' ); // and Global context
var spam = 'for all you python lovers'; // becomes a property of Global
assert( spam == window.spam, 'there not much spam in it' ); // same
function eggs () { // becomes a method of Global actually
assert( spam == window.spam, 'shut up!' ); // unqualified spam available here through closure
assert( arguments.callee == window.eggs ); // and again
}
eggs();
Mrs Mrs :JavaScript是具有自己特定特征的独特语言,因此不要将其他语言知识应用于JS(它使Douglas Crockford成为一只悲伤的熊猫:)。