function test(){
if(true){
var a = 5;
}
alert(a);
}
test();
当我检查 JsLint 时,我的 JS 代码中不断出现“超出范围”错误,这对我来说毫无意义。所以我快速创建了一个示例。这段代码是否真的有问题,因为变量最终还是被提升到函数的顶部。
function test(){
if(true){
var a = 5;
}
alert(a);
}
test();
当我检查 JsLint 时,我的 JS 代码中不断出现“超出范围”错误,这对我来说毫无意义。所以我快速创建了一个示例。这段代码是否真的有问题,因为变量最终还是被提升到函数的顶部。
虽然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;
// …
}
您编写的代码正在运行。它只是不太可读/可维护。a
在 的范围内声明变量if
可能会产生仅在此范围内可见的错误印象a
(如本程序所示,这不是真的 -a
将在整个函数中可见)。
此 JsLint 警告鼓励您将声明放置在实际使用变量的确切范围内,如下所示:
function test(){
var a;
if(true){
a = 5;
}
alert(a);
}
Javascript 有函数作用域而不是块作用域。因此,在 if 函数内部声明的变量在 if 块外部和声明 if 语句的函数内部是可见和可访问的。
JSLint 和 jsbin 等在线编译器会发出警告,但它们不是错误。