Для цикла var сохраняет значение переменной из цикла, возможно ли закрытие? - PullRequest
0 голосов
/ 13 марта 2019

Я пишу код для программы под названием illustrator, которая позволяет вам использовать JavaScript. Это сводит меня с ума, и я думаю, что это связано с замыканиями, но я не уверен, что это так, или я просто что-то упускаю.

У меня есть следующий код:

function runSomeStuff() {
  // some stuff gets done here unrelated variables set
  // after I have the following for loop which opens the document

  for (var currentTemplate = 1; currentTemplate <= 3; currentTemplate++){

    // opens file and does a few if statements... works fine.
    // here I have another for loop where the problem comes up
    for (var i = 1; i <= 18; i++) {
      // run some code here
    }
  }

}

Способ, которым он должен работать, состоит в том, что он должен повторять цикл 3 раза над первым для функции, которая содержит другой для функции. Так и должно работать вот так.

Первый для запуска функции

Второй внутри первого запуска 17 раз, затем выходит, делает то, что ему нужно, затем снова начинает работать.

Проблема в том, что после первого запуска функции for один раз, когда она возвращается в цикл, она не запускается. Вторая функция не запускается снова. Я добавил оповещение для var i, и он дал мне 19, когда он пытался запустить во второй раз. Я ожидал бы, что var i снова будет равен 1, поскольку он вызывается во втором запуске. Он появляется даже после того, как он существует, и я сохраняю его значение, когда оно было в цикле for, так что оно ложно, поскольку я был бы больше 18.

РЕДАКТИРОВАТЬ: из-за программы, в которой он используется, я не могу использовать let или const.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Причина, по которой это происходит, скорее всего связана с переменной областью видимости. Это означает, что ваши переменные перемещаются в верхнюю часть функции при объявлении. Чтобы избежать этого, вы можете объявить свои переменные следующим образом:

let i = 0;
let str = "Hello";
let arr = [1, 2, 3];

let позволяет указывать ваши переменные при первом упоминании эта проблема. Я все время использую let, и мои проблемы с областью применения исчезли.

0 голосов
/ 13 марта 2019

Причина, по которой это может произойти, связана с подъемом переменной . Я бы порекомендовал проверить, если что-то изменится, если вы объявите свои переменные в первой строке функции:

function runSomeStuff() {
  var currentTemplate, i;

  // some stuff gets done here unrelated variables set
  // after I have the following for loop which opens the document

  for (currentTemplate = 1; currentTemplate <= 3; currentTemplate++){

    // opens file and does a few if statements... works fine.
    // here I have another for loop where the problem comes up
    for (i = 1; i <= 18; i++) {
      // run some code here
    }
  }
}

Если вышеприведенное не работает, вы можете попробовать управлять своими собственными областями, переместив циклы for в IIFEs :

function runSomeStuff() {
  // some stuff gets done here unrelated variables set
  // after I have the following for loop which opens the document

  (function () {
    for (var currentTemplate = 1; currentTemplate <= 3; currentTemplate++){

      // opens file and does a few if statements... works fine.
      // here I have another for loop where the problem comes up
      (function () {
        for (var i = 1; i <= 18; i++) {
          // run some code here
        }
      })();
    }
  })();
}

Это немного мешает, но ваши циклы будут иметь свою собственную область без использования ключевого слова let.

...