For循环在后续迭代中跳过变量声明

For loop skipping variable declaration on subsequent iterations

为什么 "i" 不总是等于零?循环的后续迭代是否跳过 var 声明?我知道在第一次迭代结束时 i = 1 但是当它随后通过时,var 声明不会重置 i = 0?

当我 运行 带有 args 的函数时,它一切正常,但我只是不知道为什么 var 声明没有重置,如果这有意义的话。如果在循环外声明 var "i" 对我来说是有意义的。

function multiply(arr, n) {
    var product = 1;
    for (var i = 0; i < n; i++) {
        product *= arr[i];
    }
    return product;
  }

for 循环声明的第一部分(大部分)仅 运行 一次,在循环的最开始。您的代码相当于:

function multiply(arr, n) {
  var product = 1;
  var i = 0;
  for (; i < n; i++) {
    product *= arr[i];
  }
  return product;
}

相当于:

function multiply(arr, n) {
  var product = 1;
  var i = 0;
  while (true) {
    // for loop body:
    product *= arr[i];

    // for loop declaration part:
    i++;
    if (!(i < n)) break;
  }
  return product;
}

因此,i 只在一开始就被赋值 0 一次。

我用 限定了上面的大部分内容 因为,当用 letlet 声明变量时,行为有点奇怪具有块作用域,而不是函数作用域 - 使用 let,每次迭代都会为变量名创建一个单独的绑定。 (但在你的情况下这并不值得担心 - 只有当 for 循环异步使用变量时才真正需要考虑的事情)