先上代码:
setTimeout(() => console.log("r u OK?"), 0);
console.log("hahahaha");
你觉得会输出什么?
Why
JavaScript是单线程执行的,js引擎只是浏览器的一个线程而已。
在浏览器中测试一下以下代码,是不是永远不会alert?
var isEnd = true;
window.setTimeout(function () { //1s后,改变isEnd的值
isEnd = false;
}, 1000);
while (isEnd);
alert('end');
看下浏览器内核:
浏览器内核
js的执行顺序是遵循一个叫做事件队列的机制.从图中我们可以看出,浏览器有各种各样的线程,比如事件触发器,网络请求,定时器等等.线程的联系都是基于事件的.js引擎处理到与其他线程相关的代码,就会分发给其他线程,他们处理完之后,需要js引擎计算时就是在事件队列里面添加一个任务. 这个过程中,js并不会阻塞代码等待其他线程执行完毕,而且其他线程执行完毕后添加事件任务告诉js引擎执行相关操作.这就是js的异步编程模型.