带有setInterval普通JS的IIFE和箭头函数

时间:2019-03-25 03:44:48

标签: javascript arrow-functions iife

我有以下代码:

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

我希望上面的代码每次运行(500毫秒)都会产生00。但是,事实并非如此。它只运行了一次。当我尝试:

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

有效。我认为第一个仍然会每500毫秒打印一次00,因为带有参数array的IIFE每次运行总是被赋予值[0, 0](但是,并非如此,它只能运行一次!)。然后,第二个代码以某种方式允许array“记住”其先前的值并在每次运行时更新其值。有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

传递给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);

但是,您可以考虑在外部IIFE中定义array,以使代码更清晰:

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