javascript控制台未记录正确的循环值

时间:2016-04-03 04:27:45

标签: javascript

我将以下代码输入Chrome的javascript控制台:

function test() {
  var a = [1, 2, 3, 4];
  for (var i = 0; i < a.length; i++) {
    var a = i;
    console.log(a);
  }
  console.log(a);
}
test();

当我调用test()时,我没有获得值0,1,2,3,而是获得0两次。它似乎循环只运行一次,有谁知道为什么?

3 个答案:

答案 0 :(得分:3)

这是因为你在循环和外部使用相同的变量a。此代码可以正常工作,如您所愿:

function test() {
  var a = [1, 2, 3, 4];
  for (var i = 0; i < a.length; i++) {
    var b = i;
    console.log(b);
  }
  console.log(a);
}
test();

答案 1 :(得分:3)

变量声明(var a等)是&#34;悬挂&#34;在功能里面。 for循环没有单独的范围。忽略var的第二次使用,并在循环的第一次迭代内覆盖自相同的a。由于a现在等于0,因此循环结束。

您可以在此处详细了解吊装: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

  

因为在执行任何代码之前处理变量声明(和一般声明),所以在代码中的任何地方声明变量等同于在顶部声明它。这也意味着变量可以在声明之前使用。此行为称为&#34; hoisting&#34;,因为看起来变量声明被移动到函数或全局代码的顶部。

     

出于这个原因,建议始终在其作用域的顶部(全局代码的顶部和函数代码的顶部)声明变量,以便清楚哪些变量是函数作用域(本地)以及哪些变量在范围链上得到解决。

答案 2 :(得分:2)

这是因为你要覆盖你的变量a。因此,在第一次迭代中,您将aarray更改为0。在下一次迭代中,a没有属性length和循环中断。所以你得到0两次。

function test() {
  var a = [1, 2, 3, 4];
  var len = a.length;
  for (var i = 0; i < len; i++) {
    var a = i;
    console.log(a);
  }
  console.log(a);
}
test();

更好的方法:

function test() {
  var a = [1, 2, 3, 4];
  for (var i = 0; i < a.length; i++) {
    console.log(i);
  }
  console.log(a);
}
test();