Java与JavaScript变量范围

kan*_*rbk 0 javascript java scope

在以下Java代码段中,范围i仅限于for循环内部.这就是它导致错误的原因.但是,在类似的JS片段中,i显然可以在循环外部访问.怎么可能?

Java的:

for(int i=0;i<10;i++) {
    ...
}
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

输出:"我没有定义"

JS:

for(var i=0;i<10;i++) { 
    ...
}
console.log(i);
Run Code Online (Sandbox Code Playgroud)

产量:10

我没想到会看到JS的输出.我想知道JS与Java的不同之处.JavaScript变量范围如何工作?

Aln*_*tak 13

在Javascript中"本地"变量具有函数范围,而不是块范围.

所有局部变量声明都"挂起"到当前作用域的顶部,因此您的代码等效于:

var i;
for (i = 0; i < 10; ++i) {
}
console.log(i);
Run Code Online (Sandbox Code Playgroud)

请注意,虽然声明已悬挂,但任何作业都不会.例如这段代码

function test() {
    console.log(i);  // undefined
    var i = 1;       // declaration and assignment
    console.log(i);  // 1
}
Run Code Online (Sandbox Code Playgroud)

相当于:

function test() {
    var i;           // declaration hoisted
    console.log(i);  // undefined
    i = 1;           // assignment still happens here
    console.log(i);  // 1
}
Run Code Online (Sandbox Code Playgroud)