一道js闭包引发的惨案(js闭包)

今天又收到面试了,i开心呢,然后又凉凉了,原来以为自己真的了解了闭包,今天我发现我错了。
还好面试官人很好
啥也b说了,上题:

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

结果:六个五(我知道这是闭包,我还在0,1,2,3,4,5和六个五之间徘徊,真相抽死我)
紧接着面试官又问我,执行顺序怎样
呃呃呃,我想了一会儿
然后弱弱的说到
先执行函数外的i,然后执行计数器内部的i
然后面试官热心的告诉我:计数器是开启了另外的线程,所以执行完当前线程(也就是函数外的i),然后间隔1秒后(设置时间为1秒)在执行剩下的五个计数器
也就是函数的作用是开启了五个计数器,然后执行函数外的i,然后1秒后,计数器时间到,也开始执行!!!

结果也是这样子的
紧接着面试官又问我,如何让计数器内部的五个五变成0,1,2,3,4,哇,我心想(这不闭包吗),我知道我知道
结果一写,死活写不出来!!!
解决方法:

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

注意:方法不唯一

然后面试官就告诉我,嗯,查查百度!!

然后就没有然后了!!

看来代码还是需要多写写啊,光知道闭包是函数套函数是不行的!!!

我真是个铁憨憨!!
继续加油吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值