在以下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变量范围如何工作?
答案 0 :(得分:13)
在Javascript&#34; local&#34;变量具有功能范围,而不是块范围。
所有本地变量声明都是&#34;悬挂&#34;到当前范围的顶部,因此您的代码等同于:
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
}
答案 1 :(得分:4)
Javascript只有两种类型的范围 - 全局和功能。 Javascript在函数级别为lexically scoped。