IIFE and Arrow Functions with setInterval plain JS



我有以下代码:

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);

成功了。我以为第一个仍然会打印出0,每 500 毫秒打印一次并0一次,因为带有参数 array 的 IIFE 将始终被赋予每次运行[0, 0]的值(然而,事实并非如此,它只运行一次!然后,第二个代码以某种方式允许array"记住"其以前的值并在每次运行时更新其值。有人可以向我解释一下吗?

传递给

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
);

最新更新