为什么这段代码输出结果是十个10呢?

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

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

图片描述

阅读 5.5k
7 个回答

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

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

前面先输出的304是什么?

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

每循环一次就注册一个延迟函数,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);
}

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

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

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

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

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

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

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

推荐问题
宣传栏