繁体   English   中英

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

[英]IIFE and Arrow Functions with setInterval plain JS

我有以下代码:

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

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

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

有效。 我认为第一个仍然会每 500 毫秒打印一次00 ,因为带有参数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 );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM