function test(){
if(true){
var a = 5;
}
alert(a);
}
test();
当我使用JsLint检查时,我的JS代码中出现“超出范围”错误,这对我来说毫无意义。所以我很快创建了一个示例。这段代码是否存在实际问题,因为变量最终会被提升到函数的顶部。
答案 0 :(得分:34)
虽然var
将变量本地化为函数并且需要提升,但大多数语言都有块范围而不是函数范围。
通过在if块中使用var关键字,但访问该块之外的变量,您创建了一个可能让那些不熟悉JS特性的人感到困惑的构造。
Douglas Crockford recommends在函数顶部使用单个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;
// …
}
答案 1 :(得分:5)
您编写的代码正在运行。它不是非常易读/可维护。在a
范围内声明变量if
可能会给人一种错误的印象:a
仅在此范围内可见(正如此程序所示,这不是真的 - {{1}将在整个函数中可见。)
此JsLint警告鼓励您将声明放在实际使用变量的确切范围内,如下所示:
a
答案 2 :(得分:1)
Javascript具有功能范围而不是块范围。因此,如果函数是可见的,并且在if块之外和在声明if语句的函数内可访问,则在内部声明的变量。
像JSLint和jsbin这样的在线编译器发出警告,但它们不是错误。