IIFE и функции со стрелками с помощью setInterval plain JS - PullRequest
1 голос
/ 25 марта 2019

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

window.setInterval((array => {
  console.log(array[0]++);
  console.log(array[1]++);
})([0, 0]), 500);

Я ожидал, что приведенный выше код будет давать 0 и 0 при каждом запуске (500 мс).Однако это не так.Это только побежал один раз.Когда я пытался:

window.setInterval((array => () => {
  console.log(array[0]++);
  console.log(array[1]++);
})([0, 0]), 500);

Сработало.Я думал, что первый будет по-прежнему распечатывать 0 и 0 каждые 500 мс, так как IIFE с параметром array всегда будет получать значения [0, 0] за цикл (однако это не так, он выполнялсятолько однажды!).Затем второй код каким-то образом позволяет array «запомнить» свое предыдущее значение и обновлять его значение за цикл.Может ли кто-нибудь объяснить это мне?

1 Ответ

1 голос
/ 25 марта 2019

Первый параметр, переданный setInterval, должен быть функцией. В первом фрагменте вы немедленно вызываете функцию и возвращаете undefined:

window.setInterval((array => {
  console.log(array[0]++);
  console.log(array[1]++);
})([0, 0]), 500);

эквивалентно

window.setInterval(() => {
  // do something, return undefined
})(), 500);

и после оценки IIFE:

window.setInterval(undefined, 500);

Итак, вам нужно что-то вроде второго фрагмента, в котором IIFE также возвращает функцию:

window.setInterval((array => () => {
  console.log(array[0]++);
  console.log(array[1]++);
})([0, 0]), 500);

Хотя вы можете определить array во внешнем IIFE, чтобы сделать код немного более понятным:

window.setInterval(
  (() => {
    const array = [0, 0];
    return () => {
      console.log(array[0]++);
      console.log(array[1]++);
    };
  })(),
  500
);
...