为什么变量在代码块之外可用?

时间:2013-12-06 02:27:37

标签: javascript

5分钟前我遇到了这个小宝石。我已经玩了很长一段时间的JavaScript了,因为我遵循最佳实践,我从来没有遇到过这样的情况,也没理解为什么它可以工作而我认为不应该:

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

输出10

i块之外的for如何可用?我一直认为声明部分是只有一个局部变量才能在该块中使用。

5 个答案:

答案 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

就个人而言,我发现最佳做法是为计数器incq保留变量,并为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();

结果:

enter image description here