javascript - 为什么这段代码输出结果是十个10呢?
PHPz
PHPz 2017-04-11 13:05:14
[JavaScript讨论组]
for(i=0;i<10;i++){
    setTimeout("console.log(i)",0);
}

为什么输出结果是十个10呢?还有,前面先输出的304是什么?每次输出那个值都不一样。

PHPz
PHPz

学习是最好的投资!

全部回复(7)
怪我咯

为什么输出结果是十个10呢?

setTimeout是异步的,在这里,当for循环结束之后才开始执行队列中的代码,那for结束之后 i是多少呢? 10.
解决方法是闭包,这篇文章有详细解读你的例子

前面先输出的304是什么?

timeoutID: 标示当前的计时器,可以用于清除该定时器
window.clearTimeout(timeoutID)

ringa_lee

每循环一次就注册一个延迟函数,js是单线程的,在循环中注册延迟函数就可能会发生这种情况,循环先发生,延迟函数要等到循环完了才能执行,循环完了取到的i自然是10咯。每生成一个timeout都会有一个id,304是最后一个计时器的id
如果想实现这样的功能,可以用闭包来处理,下面的函数就可以输出1到10了

for(i=0;i<10;i++){
    setTimeout(
        (function(i){
            return function(){
                console.log(i)
            }
        })(i), 0);
}
ringa_lee

不是我说,这种闭包题几乎一周一次,代码结构都是一样的...

阿神

设置setTimeout(callback,0),callback 会在下一次轮训中进行

黄舟

细想一下,for循环每次都setTimeout,把回调传入到事件队列去,等循环结束了 ,事件队列开始处理这些传进来的回调,这个时候ifor循环以后就变成10了,这个时候每一个回调都是console.log(10);

还有 你后面那个304,你应该知道setTimeout函数的具体使用>>

304 应该是你那时候运行最后一个settimeout时返回的timeout 的timeoutID(用来clearTimeout的。)

ringa_lee

timeout 是在 for 循环完毕后才开始执行的.
详见各种解析计时器的文章.

巴扎黑

因为执行了10次这个任务。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号