javascript - for循环与闭包
为情所困
为情所困 2017-05-18 11:00:35
0
3
467

for(var i=1;i<5;i++){
setTimeout(function(){console.log(i)},i*1000);
}
在这里for循环是先完成的
然后i的值已经变成了5
那for循环是先执行完的 那i*1000为什么会执行呢

为情所困
为情所困

全部回复(3)
滿天的星座

for循环执行完时相当于在页面中写了4个定时器函数,此时定时器函数还未执行,全局中的i变量值为5;当定时器时间到的时候依次执行定时器函数,依次打印出4个5。

这个例子并不是闭包,闭包需要这样写,相当于在页面中写了四个立即执行函数,这四个函数接收到的实参依次为1,2,3,4,根据闭包的特性当定时结束时定时器函数可以访问到其外层函数接收到的实参,所以会依次打印出1,2,3,4

    for(var i=1;i<5;i++){
        (function(i){
            setTimeout(function(){console.log(i)},i*1000);
        })(i)
    }
给我你的怀抱

在电脑中,任何一个变量,都要在内存中开辟一个空间去存储,然后它们都有一个地址。如果学过c语言或汇编语言应该对这个比较清楚。

先说i为什么每次输出都是5。因为i的空间(即用于存储i的那段内存空间,学名叫“堆栈”)被修改了5次,而那个匿名函数被执行的时候,i的空间中存储的是5。

再来解释为什么第二个参数为什么每次都不一样。i*1000并没有修改i的值,而是会产生一个结果。那么这个结果必然要找地方去存。存储在哪呢?setTimeout每被调用一次,都会开辟一段内存空间,其中一部分空间就用于存储它的两个参数。其中一个参数就是刚才i*1000产生的结果。而setTimeout被调用了5次,于是存储了5个结果!没错,是在5个不同的空间存储了5个结果,而不是像i一样对同一空间修改了5次!可以想象这种做法是很费内存的。

这样解释能听懂吗?

phpcn_u1582

for函数进入主线程的时候,每个setTimeout依次进入任务队列的等待,for执行完后任务队列中setTimeout进入主线程中执行。不加闭包,setTimeout执行的时候i已经是5;加了闭包,setTimeout进入任务队列的时候i的值会被保存。
详见:事件循环

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!