51

我一直在使用 JSLint 让我对我的 JavaScript 感觉不好。顺便说一句,这很棒。有一张支票我不太明白,我想听听您的意见。

来自jslint.com

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

粗体字的最后一句话是什么意思?我想我应该像这样声明多个变量?

var foo = 1, bar = 2;

而且,“明智的”部分只是一种阻止错误的编程风格,还是还有更多?

谢谢你的帮助。

4

4 回答 4

72

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

所以如果你有这样的功能

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

警报窗口将包含未定义。因为在内部,它已更改为:

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

这称为“吊装”。crockford 如此强烈地提倡将 var 声明放在首位的原因是,它使代码明显地匹配了它将要执行的操作,而不是允许发生不可见和意外的行为。

于 2009-08-05T23:27:45.963 回答
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 没有块作用域,因此最好在函数顶部声明函数的所有变量。

检查这篇文章

于 2009-08-05T23:05:31.967 回答
6

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

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

alert(a); // Alerts "2"

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

于 2009-08-06T02:23:32.980 回答
4

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

原因在您提到的段落中进行了解释。Javascript 变量只有函数级范围。如果您在 if/while/for 块中声明相同的变量,它将被新值覆盖,因为该块不带有新的范围。这与 Java 等语言不同。为避免此类意外,请在函数开头声明您将在函数中使用的所有变量,以免意外“重新声明”和任何东西。

于 2009-08-05T23:09:51.223 回答