【问题标题】:javascript, why not remove var keyword?javascript,为什么不删除 var 关键字?
【发布时间】:2011-07-19 02:28:54
【问题描述】:

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

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

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

global foo;

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


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

【问题讨论】:

  • 好吧,如果人们不使用局部变量而不是全局变量,为什么“总是使用 var 关键字”?

标签: javascript scope var


【解决方案1】:
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,这将与以前的版本不兼容。

【讨论】:

  • 但是不行,如果没有声明 global 关键字,那么函数 Hello 中的 globalInt 将是局部变量。我觉得这样更好。
  • @netroyal,你的意思是因为var行为使用频率更高,应该设为默认,就引入另一个含义相反的关键字吗?
  • 是的,我认为是认真的,但我想知道是否有理由使用 var 关键字更好?
  • 使用全局变量也会降低函数速度。 javascript 处理器扫描函数中的变量并相应地构建堆栈帧。
【解决方案2】:
function A() {
    var foo; // variable in the scope of function A
    function B() {
        foo; // variable still in the scope of function A
    }
} 

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

【讨论】:

  • 谢谢。我没有看到这个。但是是否使用“var”只是两种样式,如果我们将“no var”定义为“var exists”,那么所有含义保持不变,只是看起来不同。
【解决方案3】:

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

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

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

【讨论】:

  • 为什么编译器无从得知? JavaScript 是一种基于块的语言,完全有理由假设程序员打算将变量限定在声明它的块中(与大多数其他语言的工作方式相同)。任何意味着全局的东西只需要在块之外声明。
  • @aroth :有点像 aroth ——但是闭包很快就会变得复杂。想想一些更复杂的案例。
  • @Hogan,感谢您指出这一点。我认为这是一个错字并回答相反:)
  • @aroth,这样说起来很容易,直到你得到一个在第三方 JS 文件中定义的全局变量。
  • 但是没有 global 关键字,编译器应该将所有变量都放在本地范围内,这是更好的方法吗?感谢您的帮助。我认为这也是语言的设计方式。
【解决方案4】:

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

【讨论】:

  • 我认为这是原始问题的重点——如果本地范围更好,为什么需要 var 关键字来执行应该是默认操作。
  • 我同意你的意见。这就是 javascript 的设计方式。
【解决方案5】:

好的,我将尝试再次解释它是如何工作的。有一个 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 结论:JavaScript 是一种不同的语言,有自己的特点,所以不要将其他语言知识应用于 JS(这让 Douglas Crockford 变成了一只悲伤的熊猫 :)

【讨论】:

  • 警报(此 === 窗口); var spam = '垃圾邮件';警报(垃圾邮件 === window.spam);功能鸡蛋(){警报(垃圾邮件=== window.spam); alert(arguments.callee === window.eggs);}eggs();
  • 你在说什么?我仔细阅读了您的话,但是您是否仔细阅读了我的问题?还是谢谢。
  • @netroyal 再次阅读关于闭包和其他语言的印象
  • 好的,我认为你的代码风格在实际项目中很好。谢谢你给这个。我只是不明白你的意思是什么。再次感谢。
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2020-02-28
  • 2018-12-16
  • 2018-02-09
相关资源
最近更新 更多