JavaScript中的每个函数一个var?

Sco*_*zie 51 javascript lint

我一直在使用JSLint让我对我的JavaScript感到不好.顺便说一下,它很棒.有一张我不太明白的支票,请你的意见.

来自jslint.com:

在具有块范围的语言中,通常建议在首次使用的站点声明变量.但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的.建议每个函数使用一个var语句.

大胆的最后一个意思是什么?我想我应该声明这样的多个变量?

var foo = 1, bar = 2;
Run Code Online (Sandbox Code Playgroud)

并且,"智慧"部分只是一种编程风格,可以阻止错误,或者还有更多的错误吗?

谢谢你的帮助.

Bre*_*ton 72

问题是,无论你是否意识到,javascript都会无形地将所有var声明移动到函数作用域的顶部.

所以,如果你有这样的功能

var i = 5;
function testvar () {
     alert(i);
     var i=3;
}
testvar();
Run Code Online (Sandbox Code Playgroud)

警报窗口将包含undefined.因为在内部,它已被改为:

var i = 5;
function testvar () {
     var i;
     alert(i);
     i=3;
}
testvar();
Run Code Online (Sandbox Code Playgroud)

这被称为"吊装".crockford如此强烈主张var声明的原因在于它使得代码明显与它将要做的事情相匹配,而不是允许发生隐形和意外行为.

  • 在函数顶部声明变量往往会使手动重构变得困难.您不必将代码块剪切/粘贴到新函数中,而是必须执行两次才能获取变量.它还倾向于导致开发人员在代码被修改时留下未使用的变量(不在网站之外).在一个地方声明可能允许使用Google闭包编译器等额外压缩.但是,随着时间的推移,无论声明变量的位置如何,都可能会进行此类优化. (17认同)
  • 这并没有回答以粗体突出显示的问题部分,即为什么只推荐一个var语句.这只解释了var语句出现在函数开头的原因.有什么想法,为什么只推荐一个?我很好奇,因为我的眼睛会对代码的可读性产生负面影响. (16认同)
  • @ Michael-Lang - 如果你假设所有的变量声明都在函数的开头,那么它们也可以用一个`var`语句来完成,但我仍然会把各个变量名放在不同的行上.我觉得比在每一行重复`var`更容易阅读.(相反,我在同一行上找到逗号分隔的变量声明更难以阅读.) (2认同)
  • 答案需要更多的分号...... :) (2认同)

CMS*_*CMS 8

基本上在JavaScript blocks({ ... })中不引入新范围,只有函数范围,因此不会在任何其他语句上创建范围.

函数中任何位置引入的变量在函数中的任何位置都可见.

例如:

function myFunction(){
  var one = 1;

  if (one){
    var two = one + 1;
  }

  (function () {
    var three = one + two;
  })();

  // at this point both variables *one* and *two* are accessible but 
  // the variable *three* was declared in the scope of a inner function
  // and is not accessible  at this point.
}
Run Code Online (Sandbox Code Playgroud)

在具有块作用域的语言中,建议在首次使用时声明变量,但由于JavaScript没有块作用域,因此最好在函数顶部声明所有函数的变量.

看看这篇文章.

  • 我刚读过你链接的文章,它和Chetan犯了同样的错误.重新声明var是一个NOOP.它是完全良性的,不会引起任何问题.这并不是说限制自己使用一个var语句是没用的,但是你和文章实际上已经为它做了一个令人信服的案例. (3认同)
  • 你并没有真正解释为什么它会更好.它最终会从功能范围开始,最好是变量位于顶部.但是你已经把这个事实的推理步骤遗漏给了你的结论. (2认同)

Tri*_*ych 6

块范围的缺乏解释了以下代码:

var a = 1;
if (something) {
    var a = 2;
}

alert(a); // Alerts "2"
Run Code Online (Sandbox Code Playgroud)

在大多数C风格(如语法)语言中,var a = 2定义仅为if块的范围定义"a" .在函数顶部使用单个var语句有助于避免这种Javascript的怪癖,这并不总是如上所述,并且对于C/C#/ Java程序员来说是意料之外的.