5分钟前我遇到了这个小宝石。我已经玩了很长一段时间的JavaScript了,因为我遵循最佳实践,我从来没有遇到过这样的情况,也没理解为什么它可以工作而我认为不应该:
for (var i=0; i<10; i++){
// ... something
}
console.log("i=", i);
将输出10
i
块之外的for
如何可用?我一直认为声明部分是只有一个局部变量才能在该块中使用。
答案 0 :(得分:4)
我一直认为声明部分是只有一个局部变量才能在该块中使用。
不,不是用JavaScript。
JavaScript循环(通常大多数块)都没有块作用域(在此之前,下一版本将使用let
推出。)
目前只有两个地方可以阻止范围,with
条款(你不应该使用这些条款)和catch
条款。
相反,JavaScript主要依赖于函数作用域 - 函数中声明的变量是该函数的本地变量。
答案 1 :(得分:2)
因为那相当于:
var i=0;
while (i<10){
// ... something
i++;
}
实际上,循环甚至根本不创建自己的范围:
var x = 0;
while (x < 10) {
x++;
var i = 5;
}
i; // 5
答案 2 :(得分:2)
在这种情况下,i
的声明在代码块之外。在任何情况下,Javascript都没有块级范围。变量可以是全局变量,也可以是函数范围内的变量。
答案 3 :(得分:0)
i
将在您定义它的位置下方提供,除非您关闭范围,例如:
(function(){
for(var i=0; i<10; i++){
}
})();
console.log(i); // undefined
这应该无关紧要,因为只要您使用下面的其他循环,就可以使用相同的增量变量(嵌套循环除外),这将覆盖另一个。当您有一个忘记使用关键字var
的循环时,可能会出现问题。始终使用var
将是我的建议。通常不需要关闭。
在嵌套循环中,您可以再次使用相同的增量变量,如:
for(var i=0; i<10; i++){
for(var n=2; n<44; n+=2){
}
}
// feel free to use `i` and `n` again
或像这样循环:
var ar1 = ['a', 'b', 'c'];
for(var i=0,l=ar1.length,n=0; i<l; i++,n+=2){
}
// feel free to use `i`, `l`, and `n` again
就个人而言,我发现最佳做法是为计数器i
,n
,c
和q
保留变量,并为l
保留长度。然后我不在其他地方使用它们,除了循环。
答案 4 :(得分:0)
在javascript中,没有“块范围”,而是“功能范围”。这意味着,只要你的变量在函数内定义,它们就会从它们被声明的那一刻起保持活着,直到该函数结束,无论是在块的内部还是外部。
以下是js变量范围的测试用例(来自Secrets of the Javascript Ninja,第3.2.1节范围和函数)
测试用例:
function outer(){
var a = 1;
function inner(){ /* does nothing */ }
var b = 2;
if (a == 1) {
var c = 3;
}
}
outer();
结果: