0

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

爪哇:

for(int i=0;i<10;i++) {
    ...
}
System.out.println(i);

输出:“我没有定义”

JS:

for(var i=0;i<10;i++) { 
    ...
}
console.log(i);

输出:10

我没想到会看到 JS 的输出。我想知道 JS 与 Java 有何不同。JavaScript 变量作用域是如何工作的?

4

2 回答 2

13

在 Javascript 中,“本地”变量具有函数作用域,而不是块作用域

所有局部变量声明都“提升”到当前范围的顶部,因此您的代码等效于:

var i;
for (i = 0; i < 10; ++i) {
}
console.log(i);

请注意,当声明被提升时,任何分配都不会。例如这段代码

function test() {
    console.log(i);  // undefined
    var i = 1;       // declaration and assignment
    console.log(i);  // 1
}

相当于:

function test() {
    var i;           // declaration hoisted
    console.log(i);  // undefined
    i = 1;           // assignment still happens here
    console.log(i);  // 1
}
于 2012-09-28T18:03:43.313 回答
4

Javascript 只有两种类型的作用域——全局和函数。Javascript在函数级别的词法范围。

于 2012-09-28T18:03:58.227 回答