for(i=0;i<10;i++){
setTimeout("console.log(i)",0);
}
为什么输出结果是十个10呢?还有,前面先输出的304是什么?每次输出那个值都不一样。
for(i=0;i<10;i++){
setTimeout("console.log(i)",0);
}
为什么输出结果是十个10呢?还有,前面先输出的304是什么?每次输出那个值都不一样。
每循环一次就注册一个延迟函数,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);
}
细想一下,for
循环每次都setTimeout
,把回调传入到事件队列去,等循环结束了 ,事件队列开始处理这些传进来的回调,这个时候i
在for
循环以后就变成10了,这个时候每一个回调都是console.log(10)
;
还有 你后面那个304,你应该知道setTimeout函数的具体使用>>
304 应该是你那时候运行最后一个settimeout时返回的timeout 的timeoutID(用来clearTimeout的。)
27 回答13.1k 阅读
8 回答3.5k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
5 回答5.3k 阅读✓ 已解决
4 回答1.6k 阅读✓ 已解决
3 回答1.7k 阅读
4 回答2.3k 阅读✓ 已解决
为什么输出结果是十个10呢?
setTimeout是异步的,在这里,当for循环结束之后才开始执行队列中的代码,那for结束之后
i
是多少呢? 10.解决方法是闭包,这篇文章有详细解读你的例子
前面先输出的304是什么?
timeoutID
: 标示当前的计时器,可以用于清除该定时器window.clearTimeout(timeoutID)