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

javascript console not logging correct for loop values

本文关键字:不正确 循环 控制台 记录 javascript      更新时间:2023-12-15

i在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。循环似乎只运行过一次,有人知道为什么吗?

这是因为在循环内外都使用了相同的变量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();

变量声明(var a等)在函数内部被"提升"。for循环没有单独的作用域。var的第二次使用被忽略,并且相同的a在循环的第一次迭代内被重写。由于a现在等于0,因此循环结束。

您可以在这里阅读更多关于吊装的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

因为变量声明(以及一般的声明)是在执行任何代码之前处理的,所以在代码中的任何位置声明变量都相当于在顶部声明变量。这也意味着一个变量在声明之前就可以被使用。这种行为被称为"提升",因为变量声明似乎被移动到了函数或全局代码的顶部。

因此,建议始终在其作用域的顶部(全局代码的顶部和函数代码的顶部)声明变量,以便清楚哪些变量是函数作用域(本地)的,哪些变量在作用域链上解析。

这是因为您正在覆盖变量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();