4

几乎所有的 JavaScript 书籍都这么说

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

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

global foo;

我们几乎一直使用局部变量,不是吗?有充分的理由吗?谢谢你的帮助。


编辑:感谢您的所有帮助,我认为一定有充分的理由表明使用 var 更好,所以我没有试图改变语言的样子。

4

5 回答 5

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。

于 2011-03-20T11:45:55.537 回答
4
function A() {
    var foo; // variable in the scope of function A
    function B() {
        foo; // variable still in the scope of function A
    }
} 

如果选择是“最窄范围”或“全局范围”,那么这是不可能的。

于 2011-03-20T11:52:10.863 回答
3

这正是语言的设计方式。如果一个变量是自动分配的,它将在全局范围内分配。

如果您考虑一下,这很有意义。变量应该分配在什么范围内?编译器无法通过显式声明了解程序员的目标

无论好坏,JS 的设计方式都是如此。我相信允许变量自动声明是一个错误,但鉴于它存在于 JS 中,将它们设为全局是有意义的,因为 JS 没有块级范围。

于 2011-03-20T11:46:28.350 回答
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();

结论夫人:JavaScript 是具有自己特定特征的不同语言,所以不要将其他语言知识应用于 JS(这让 Douglas Crockford 成为一只悲伤的熊猫 :)

于 2011-03-20T13:09:43.027 回答
1

在函数中使用 var 关键字在局部范围内声明变量,从而防止覆盖任何全局变量。想法是安全起见,并使用 var。如果您知道自己在做什么(100% 确定不会覆盖任何全局变量),请随意丢弃 var。

于 2011-03-20T11:49:19.300 回答