ifor(var i = 0;i < 2;i++){
setTimeout(function (){
alert(i)
},0)
}
输出 两次 2 。
因为 javascript 是 单线程 执行的,也就是无法同时执行多段代码,当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队形,一旦当前任务执行完毕,再从队列中,取出下一个任务,这也常被成为“阻塞式执行”。
如果代码中,设定了一个 setTimeout ,那么浏览器,便会在合适时间,将代码插入任务队列,如果这个时间设为 0 ,就代表 立即插入队列,但不是立即执行,仍然,要等待前面代码执行完毕。而在 我们这个 demo 里 for 循环 就是 所谓的 前面的代码,定时器 执行的 时机,只能在 for 循环结束,所以此时的 i 已经为 2 了 。
javascript 是 单个 执行的, 也就是 无法同时 执行 多 { 段 } 代码,当 某 一 段 代码 正在 执行的时候,所有,后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中 取出下一个任务。
这就是 “阻塞式执行”。
如果代码中,设定了 一个 setTimeout ,那么浏览器便会在合适的时间,将代码插入任务队列,如果,这个时间设为 0 , 就代表 立即插入队列,但不是立即执行,仍然,要等待前面代码执行完毕。
而我们这个 demo 里 for 循环,就是所谓的前面的代码,定时器执行的时机,只能在 for 循环结束,所以此时的 i 已经为 2 了 。
网友评论