简述javascript 运行机制

本文介绍了JavaScript的单线程运行机制及其如何处理同步与异步任务,阐述了事件循环(Event Loop)的工作原理,并提供了典型的异步任务示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文简约介绍些javascript的运行机制,比较抽象,可先有一道面试题引入:
在这里插入图片描述
这一题看似很简单,但如果你不了解JavaScript运行机制,很容易就答错了。题目的答案是依次输出1 2 3,如果你有疑惑,下文有详细解释。
首先!JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这就是javascript的一大特性。
那么单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。JavaScript语言的设计者意识到这个问题,将所有任务分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。接下来我们通过两个例子说明同步任务和异步任务的区别:
在这里插入图片描述
上面例子答案是A,原因是这是一条同步任务,程序从上到下运行,console.log()虽然是立即执行函数,但是运行完a之后,遇到while()死循环,下面语句就没办法执行。
在这里插入图片描述
上面答案依然是A,原因是setTimeout()是个异步任务,javascript的特性是在所有同步任务执行完之前,任何的异步任务是不会执行的
所以运行完A后接着遇到while()死循环

以上你或许有些疑惑,那么继续往下看

异步执行的运行机制如下
所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
主线程不断重复上面的第三步。
主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会循环反复。以下这张图可以很好说明这点。
在这里插入图片描述
一般来说,有以下四种会放入异步任务队列:

setTimeout和setlnterval
DOM事件
ES6中的Promise
Ajax异步请求
javascript 代码运行分两个阶段:

1、预解析—把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前

2、执行—从上到下执行(按照js运行机制)

至于放入异步任务队列的时机,我们通过 setTimeout的例子和Ajax例子来详细说明:
在这里插入图片描述
for循环一次碰到一个 setTimeout(),并不是马上把setTimeout()拿到异步队列中,而要等到一秒后,才将其放到任务队列里面,一旦"执行栈"中的所有同步任务执行完毕(即for循环结束,此时i已经为5),系统就会读取已经存放"任务队列"的setTimeout()(有五个),于是答案是输出5个5。

上面也提到,在到达指定时间时,定时器就会将相应回调函数插入“任务队列”尾部。这就是“定时器(timer)”功能。

关于定时器的重要补充:

定时器包括setTimeout与 setInterval 两个方法。它们的第二个参数是指定其回调函数推迟/每隔多少毫秒数后执行。

对于第二个参数有以下需要注意的地方:当第二个参数缺省时,默认为 0;当指定的值小于 4 毫秒,则增加到 4ms(4ms 是 HTML5 标准指定的,对于 2010 年及之前的浏览器则是 10ms);也就是说至少需要4毫秒,该setTimeout()拿到任务队列中。
在这里插入图片描述
在这里插入图片描述
ajax加载完成时才会放入异步队列,至于这段时间不确定,所有有两种情况:①大于100ms,最后的结果是 d c b a ;②小于100ms,最后的结果便是d c a b。
那么,如果要输出0~4,上面例题应该如何修改?

  1. 将var变为let
    在这里插入图片描述
  2. 加个立即执行函数
    在这里插入图片描述
  3. 也可以通过这样加闭包
    在这里插入图片描述
    本文知识来源
    https://baijiahao.baidu.com/s?id=1615713540466951098&wfr=spider&for=pc
    希望能帮到大家~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值