javascript - 问一下闭包和for循环的问题

查看:80
本文介绍了javascript - 问一下闭包和for循环的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

setTimeout(function () {

    console.log(i);
}, i*1000);

}
这段代码中为何1000秒*i中的i的值为1

这个问题已被关闭,原因:问题已解决 - 问题已解决,且对他人无借鉴意义

解决方案

首先问题问错了,你应该这么问:
这段代码中为何1000秒*i中的i的值分别为1,2,3,4,5(或者为啥1秒输出一次),而最后打印的i是6

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

从头来i=1,执行了

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

注意是setTimeout()(函数的调用)的形式。所以i*1000是实参,需要找i的具体值,i=1,也就是执行了setTimeout(function () {console.log(i);}, 1*1000);
而前面的function () {console.log(i);}只是声明了一个匿名函数作为setTimeout的第一个参数,作为回调函数等会执行。
同样i=2,执行了setTimeout(function () {console.log(i);}, 2*1000);
同样i=3,执行了setTimeout(function () {console.log(i);}, 3*1000);
同样i=4,执行了setTimeout(function () {console.log(i);}, 4*1000);
同样i=5,执行了setTimeout(function () {console.log(i);}, 5*1000);
最后i++,i=6,不满足限制条件i<=5,停止循环,此时i=6
然后等待事件队列中的回调函数执行。
按照时间1s到了执行function () {console.log(i),去外部作用域查找i,i=6,输出6,
2s,3s,4s,5s同理,所以输出5个6

先去看下作用域的概念,再看下函数执行顺序,最后可以查查event loop。

这篇关于javascript - 问一下闭包和for循环的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆