JavaScript中的每个函数一个var?

时间:2009-08-05 23:01:55

标签: javascript lint

我一直在使用JSLint让我对我的JavaScript感到不好。顺便说一下,它很棒。有一张我不太了解的支票,请您的意见。

来自jslint.com

  

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

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

var foo = 1, bar = 2;

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

感谢您的帮助。

4 个答案:

答案 0 :(得分:72)

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

所以如果你有这样的功能

var i = 5;
function testvar () {
     alert(i);
     var i=3;
}
testvar();

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

var i = 5;
function testvar () {
     var i;
     alert(i);
     i=3;
}
testvar();
这被称为“吊装”。 crockford如此强烈主张var声明的原因在于它使得代码明显与它要做的事情相匹配,而不是允许发生看不见的和意外的行为。

答案 1 :(得分:8)

基本上在JavaScript块({ ... })中没有引入新的作用域,只有函数作用域,因此不会在任何其他语句上创建作用域。

函数中任何位置引入的变量在函数中随处可见。

例如:

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.
}

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

选中article

答案 2 :(得分:6)

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

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

alert(a); // Alerts "2"

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

答案 3 :(得分:4)

是的,这意味着您在函数的开头声明所有变量。无论您想要在一行还是多行中进行操作都是一个选择。

原因在你提到的段落中有解释。 Javascript变量只有函数级别范围。如果在if / while / for块中声明相同的变量,它将被新值覆盖,因为该块不带有新的作用域。这与Java等语言不同。为了避免这些意外,请在函数开头声明要在函数中使用的所有变量,这样就不会意外地“重新声明”和/或其他。