javascript面试题 - 关于setTimeout异步的案例

javascript面试题 - 关于setTimeout异步的案例

以下代码中 end 字符串什么时候输出?

var t = true;
window.setTimeout(function (){
  console.log('123');   // 不执行
  t = false;
},1000);
while (t){}
alert('end');

结果是死循环,永远不弹出'end'

原因:js是单线程的,while和alert都是同步代码,所以会先执行while再alert,而while循环是一个死循环,所以alert也不会执行。setTimeout是异步代码,因为js的工作机制是当主线程中没有执行任何同步代码的前提下才会执行异步代码,所以setTimeout只能等while完了才会执行,但死循环是永远不会停止的,所以setTimeout也不会执行。

总结:当线程中没有执行任何同步代码的前提下才会执行异步代码