javascript,为什么不删除var关键字?

时间:2011-03-20 11:42:32

标签: javascript scope var

几乎所有的javascript书都说

  

总是使用var关键字   声明变量,因为没有   var,变量将声明为   全局变量。

那么,为什么不删除var关键字,将默认声明作为本地范围? 像Python一样,如果你想使用全局变量,你可以写:

global foo;
我们几乎所有时间都使用局部变量,不是吗? 有充分的理由吗? 谢谢你的帮助。


编辑: 感谢您的所有帮助,我认为必须有一个很好的理由表明使用var更好,所以我没有尝试改变它的语言。

5 个答案:

答案 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成为一只悲伤的熊猫:)。