立即调用setTimeOut表达式

时间:2016-06-13 18:32:12

标签: javascript closures iife

在下面的代码中,我使用IIFE在循环的当前迭代期间立即执行闭包。

for(var i = 0; i < 3; i++) {
  console.log('Im in counter ' + i);
  (function() {
    var num = i;
    setTimeout(function() {
        console.log(num);
    },0);
  })();
};

以上代码打印输出如下:
我在柜台0
我在柜台1中 我在柜台2中 0
1
2

如果在当前迭代中立即调用闭包,则以下输出是预期的而不是上面给出的实际输出。任何人都可以在for循环中解释IIFE这种奇怪行为的原因吗? 我在柜台0
0
我在柜台1中 1
我在柜台2中 2

2 个答案:

答案 0 :(得分:3)

将函数传递给setTimeout会将其置于队列中。它将在以下情况下触发:

  • 时间(您没有指定一个,但是应用的最短时间已经用完)
  • 事件循环不忙于运行其他功能

所以你进入循环。记录该值。在setTimeout队列上放置一个函数。然后重复一遍

最终你到了循环的尽头。该功能完成。因此,计时器耗尽,并执行setTimeout函数。下一个会这样做。等等。

答案 1 :(得分:1)

以下答案是正确的。 setTimeout函数立即执行(您可以通过写入setTimeout的返回来验证这一点,setTimeout是计时器的标识符)。而不是使用循环,只需在每次传递给setTimeout的函数执行时验证该值。看看这段代码:

  var num = 3;

function a(x) {
  setTimeout(function c() {
    console.log(x);
    x++;
    if (x<= num) a(x);
  },1000);
}

a(0);

a以初始值0调用。这将设置超时以记录该值。在该函数中,如果数字小于num变量,则它再次调用自身。