立即执行函数为什么能跳过事件队列立即执行

小白问题,求给位赏脸

for (var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, i * 1000 );
}

知道输出5个5 知道这快是事件队列和作用域引起的,但是当使用闭包时结果不同;

for (var i = 0; i < 5; i++) {

(function(x) {
    setTimeout(function() { console.log(x); }, x * 1000 );
})(i);

}

一次输出0, 1,2,3,4 ;
可是 里面这和立即执行函数的作用是什么?是直接改变了事件队列吗?

求大神,大佬指点~~

阅读 2.4k
2 个回答

5个5是循环中每个迭代在运行时都会给自己捕获一个i 后面那段代码则是通过申声明并立即执行函数来创建一个函数来创建作用域的 具体看看我的这篇文章 闭包

前端菜鸡发表下自己看法:

首先明确第一点,和"事件队列"没有关系,事件队列依然是匿名函数调用后执行内在定时器,函数结束,定时器加入;
为什么输入结果不同,个人理解是变量作用域问题。
匿名函数将变量i作为参数传入,闭包本身能够储存局部变量不被销毁,x可以这么理解,每次调用被i赋值。
推荐问题
宣传栏