28
function test(){
    if(true){
        var a = 5;
    }
    alert(a);
}

test();

当我检查 JsLint 时,我的 JS 代码中不断出现“超出范围”错误,这对我来说毫无意义。所以我快速创建了一个示例。这段代码是否真的有问题,因为变量最终还是被提升到函数的顶部。

4

3 回答 3

34

虽然var将变量本地化到函数并受到提升,但大多数语言都有块范围而不是函数范围。

通过在 if 块内使用 var 关键字,但在该块外访问变量,您创建的构造可能会让不熟悉该 JS 特性的人感到困惑。

Douglas Crockford 建议在函数顶部使用单个var语句,指定应该作用于该函数的所有变量。

function test(){
    var a;
    if(true){
        a = 5;
    }
    alert(a);
}

test();

使用多个变量,您将拥有:

function foo () {
    var a, b, c, d = "only d has an initial value", e;
    // …
}
于 2010-03-20T23:19:33.377 回答
5

您编写的代码正在运行。它只是不太可读/可维护。a在 的范围内声明变量if可能会产生仅在此范围内可见的错误印象a(如本程序所示,这不是真的 -a将在整个函数中可见)。

此 JsLint 警告鼓励您将声明放置在实际使用变量的确切范围内,如下所示:

function test(){
  var a;
  if(true){
      a = 5;
  }
  alert(a);
}
于 2010-03-20T23:21:49.237 回答
1

Javascript 有函数作用域而不是块作用域。因此,在 if 函数内部声明的变量在 if 块外部和声明 if 语句的函数内部是可见和可访问的。

JSLint 和 jsbin 等在线编译器会发出警告,但它们不是错误。

于 2018-02-24T12:05:23.290 回答