setTimeout回调函数为立即执行函数的情况

如果setTimeout中放普通函数,是正常的事件循环机制,setTimeout中的代码会在主线程中代码执行完后再执行,如下代码:

  console.log('start')
  setTimeout(function(){
    console.log('setTimeout')
  },0)
  console.log('end')

输出结果:

clipboard.png

但是如果我把普通函数改成立即执行函数的话,即改成下面这样:

    console.log('start')
    setTimeout((function () {
      console.log('setTimeout')
    })(), 0)
    console.log('end')

输出结果:

clipboard.png
    我想问的问题就是下面这种使用立即执行函数的情况,setTimeout就不会放在异步事件队列中吗,还是说因为有立即执行函数,会先去异步事件队列中运行函数再回主线程呢?谢谢解答。

阅读 5.4k
3 个回答

你既然都知道叫立即执行函数了,"立即执行"从字面上看不懂意思吗,它不用等回调,代码加载就立即执行。
按你第二种写法,setTimeout收到的参数实际是你那个立即执行函数的返回值,也就是undefined

console.log('start');
setTimeout((function () {
  console.log('立即执行');
  return function () {
    console.log('setTimeout');
  };
})(), 0);
console.log('end');

可以试下运行这段,给立即执行函数return一个functionsetTimeout执行的是这个function

老哥,超时调用即使你写0也是异步,只要是异步就要最后执行。

非函数会进行 eval 和 new Function 之类的操作;
上面的然而并不是函数的返回值, 只是一个立即执行函数罢了

推荐问题
宣传栏