js运行机制

it2026-01-20  8

一、JS的单线程

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事

二、任务队列(消息队列)

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。JavaScript语言的设计者意识到这个问题,将所有任务分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

setTimeout()是个异步任务。在所有同步任务执行完之前,任何的异步任务是不会执行的

三、理解Event Loop(事件循环)

异步执行的运行机制如下:

1.所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

2.主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。

3.一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

4.主线程不断重复上面的第三步。

主线程从"任务队列"中读取事件,这个过程是不断循环的,所以整个的这种运行机制又称为Event Loop(事件循环)。只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。

异步任务队列:

setTimeout和setlntervalDOM事件ES6中的PromiseAjax异步请求

 

 题目:

 如果要输出0~4,上面例题应该如何修改?(考过)

for (var i=0;i<5;i++){ setTimeout(function(){ console.log(i) },1000) } // 输出 5 5 5 5 5

 1. 将var变为let

for (let i=0;i<5;i++){ setTimeout(function(){ console.log(i) },1000) } // 输出 0 1 2 3 4

2. 加个立即执行函数 

for (var i=0;i<5;i++){ (function(i){ setTimeout(function(){ console.log(i) },1000) })(i) } // 输出 0 1 2 3 4

 3. 也可以通过这样加闭包

for (let i=0;i<5;i++){ var a=function(){     var j=i     setTimeout(function(){         console.log(j)     },1000) } a() } // 输出 0 1 2 3 4

 

最新回复(0)