Javascript运行机制

一.首先我们先来看一道面试题

console.log(1);
setTimeout(function(){
    console.log(2)
    },1000);
console.log(3)
//数字打印顺序是什么?

其实数字打印的顺序是1 3 2,如果没有弄懂js运行机制,还是容易搞错的。

二、JS单线程

1.javascript语言的一大特点就是单线程,他不像其他的语言那样可以多线程操作,
何为单线程呢。通俗点说,就是同一时间只能干一件事情。比如,你在做饭的时候
,烧水需要十分钟,单线程就是在这十分钟之内只能烧水,你不能做其他的事情。
这样肯定就导致了执行效率低.

2.所以为什么javaScript不能多线程呢?那是因为javascript的单线程与他的与他的用途有关,
作为浏览器的脚本语言,他的主要用途是交互和Dom操作,于是这也就决定了他只能是单线程操作,、否者会带来很复杂的操作。

三、任务队列

1.线程意味着,所有的任务都要排队,就算前一个任务耗时很长,在其之后的任务也不得不等着,
等前一个任务执行完之后,后一个任务才会开始执行。考虑到这一点,于是就出现了同步机制和异步机制。同步指的是在主线程上排队的任务只有只有前一个任务执行结束,后一个任务才会开始执行。异步指的是任务不进入主线程,而进入“任务队列”,只有“任务队列”通知某个任务可以执行了,该任务才会进入主线程进行执行。例如

console.log(1);
while(true){}
console.log(2)
//最后输出的结果是什么。
因为这是同步任务,程序从上往下执行,当执行到while时,是个无限循环,在其下面的代码也就不会执行,所有最后输出的结果是 1。
console.log(1);
setTimeout(function(){
    console.log(2)
    },1000);
while(true){};
//最后输出的是什么
这里的答案是1,这里的异步任务就是setTimeout(),在所有的同步任务执行之前,所有的异步任务是不会执行的。就是异步任务总是执行在同步任务之后。

四、异步机制

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

1.所有的同步任务都在主线程上执行,形成一个执行栈;

2.主线程之外还有一个任务队列,只要异步任务有了结果,就在任务队列之中放置一个事件

3.一旦所有的同步任务执行完毕,系统就会读取任务队列,其中的异步任务就会停止等待,进入执行栈中执行

4.主线程不断重复上面三步,即只要执行栈中空了,就会去读取任务队列,这就是javascript的运行机制。如下图所示

五、会被当做异步任务的语句

1.setTimeout和setInterval

2.DOM事件

3.ES6中的Promise

4.Ajax异步请求

javascript代码运行分为两个阶段:

1.预解析,就是把所有函数定义和函数声明提前

2.执行,按照js运行机制从上到下执行。

Last modification:March 5th, 2020 at 02:00 am
如果觉得我的文章对你有用,请随意赞赏