Для l oop пропуска объявления переменных на последующих итерациях - PullRequest
1 голос
/ 21 апреля 2020

Почему «я» не всегда равно нулю? Последующие итерации l oop пропускают объявление var? Я знаю, что в конце первой итерации i = 1, но когда она проходит впоследствии, объявление var не сбрасывается, i = 0?

Когда я запускаю функцию с аргументами, все работает, но я просто не Не знаю, почему объявление var не сбрасывается, если это имеет смысл. Было бы разумно, если бы переменная "i" была объявлена ​​вне l oop.

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

1 Ответ

1 голос
/ 21 апреля 2020

Первый раздел объявления for l oop (по большей части) выполняется только один раз, в самом начале l oop. Ваш код эквивалентен:

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 только один раз, в самом начале.

Я уточнил выше с помощью по большей части , потому что, когда поведение несколько страннее, когда переменная объявлена ​​с let, а let имеет область видимости блока, а не область действия функции - с let, каждая итерация создает отдельную привязку для имени переменной. (но это не стоит беспокоиться в вашем случае - это действительно то, что нужно учитывать, когда for l oop использует переменную асинхронно)

...