返回顶部
首页 > 资讯 > 前端开发 > VUE >怎样掌握JavaScript执行机制
  • 626
分享到

怎样掌握JavaScript执行机制

2024-04-02 19:04:59 626人浏览 安东尼
摘要

本篇文章为大家展示了怎样掌握javascript执行机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、为什么JavaScript是单线程如果想了解JavaScr

本篇文章为大家展示了怎样掌握javascript执行机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、为什么JavaScript是单线程

如果想了解JavaScript为什么是单线程的,我们就要从JavaScript是用来做什么工作的来入手。

JavaScript作为浏览器的脚本语言,产出的目的就是为了浏览器与用户进行交互,操作DOM元素,从而提升用户的交互及体验感。JavaScript要操作浏览器的DOM元素,因此导致JavaScript无法成为多线程语言,我们假设一个场景,如果JavaScript是多线程语言,两个线程同时操作一个DOM元素,一个线程需要编辑更新DOM元素,而另一个则是删除DOM元素节点,这是浏览器应该以哪个为准呢?

同一时间只能做同一件事情,因为操作DOM元素的原因,导致单线程是JavaScript这门语言的核心,也是这门语言特点。

HTML5提出WEB Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。即使这样的改动也并没有改变js单线程的本质。

二、JavaScript中的同步与异步

javaScript的单线程机制,就导致同一时间只能做一件事情。就像一堆人在ATM取款机取款,即使后面再多的人在着急,也只能一个一个的排队,等待前一个人取完款,才能轮到后一人。

可是这样会导致如果说前一个任务消耗时间过长,后一个任务就会等待非常久,比如,我们需要加载一个数据量非常大的ajax请求,我们不得不等待请求相应结果,再继续往下行执后续任务。

那我们该如何处理这种情况呢?既然我们无法改变JavaScript的单线程机制,我们是否可以将一些耗时久的任务进行暂时挂起,等到主任务执行完成之后,再将这些挂载的任务执行。JavaScript的作者也想到了这样的方式,JavaScript拥有了同步任务与异步任务。

同步任务就是,任务在主线程上进行排队,下一个任务必须等待上一个任务执行完成,才可以执行。而异步任务是指,任务不进入主线程,而进入任务队列(task queue)进行等待,进入任务队列的任务只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

三、Event Loop事件循环机制

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

任务队列是先进先出的原则,先进队列的事件先执行,后进队列的事件后执行。

Event Loop

  • 执行执行栈中的同步任务。

  • 当遇到一个异步任务后不会一直等待其返回结果,会先将异步任务进行暂时挂起,继续执行其他的同步任务。

  • 当异步任务有结果之后,JavaScript会任务将添加进任务队列中。被添加进任务队列中的任务不会立刻进行回调执行而是等待主线程(执行栈)空闲时才加入到执行栈中进行回调执行

  • 等待执行栈中的任务执行完毕。

  • 将任务队列中的任务加入执行栈后执行。

如此反复,这样就形成了一个无限的循环(event loop)。(下图来自网络

怎样掌握JavaScript执行机制

学习了 Event Loop 我们一起来看看下面这道题:

setTimeout(function(){
     console.log('setTimeout start')
 });
 new Promise(function(resolve){
     console.log('promise start');
     resolve()
 }).then(function(){
     console.log('promise then')
 });
 console.log('script end');

尝试按照,上文我们刚学到的JavaScript执行机制去分析

1. 首先执行同步任务,执行到setTimeout,但是setTimeout是异步任务的暂时挂起,等待计时超时,添加进任务队列中。

2. 继续往下,在执行到new Promise,new Promise里面的是同步任务,打印 "promise start"。

3. 在执行到resolve将.then添加进任务队列中。

4. 在执行 console.log('script end');打印"script end"。

5. 这时主任务都已经执行完成,在将异步任务添加进主任务中直接执行,打印"setTimeout start",再将.then添加进主任务中,打印"promise then"。

所以结果应该是:promise start -> script end -> setTimeout start -> promise then 吗?

亲自在浏览器执行后,结果居然不是这样,而是 promise start -> script end -> promise then -> setTimeout start

宏任务与微任务

那为什么上文中的结果为什么跟我们预想的不一致,为什么 setTimeout start 会在 promise 之后打印。

其实是因为异步的执行也是有先后顺序的。其实用异步跟同步的方式去划分任务队列的执行顺序是不准确的。应该划分为 微任务 与 宏任务。

  • 宏任务(Macro-task):script 代码、setTimeout、setInterval

  • 微任务(micro-task):Promise、process.nextTick

所以说setTimeout是异步任务中的 宏任务 ,而Promise是异步任务中的 微任务 。不管是 微任务 还是 宏任务,都会进入相应的 Event Queue, 接下来我们在看一个流程图。

怎样掌握JavaScript执行机制

我们来稍微理解一下:

  • 1. 执行宏任务(script代码)

  • 2. 当执行宏任务的时遇到了微任务,就会将微任务添加进 Event Queue

  • 3. 在当前宏任务执行完成后,会查看微任务的 Event Queue ,并将里面全部的微任务依次执行完

  • 4. 在执行玩所有的为微任务之后,继续进行第一步,以此循环

这便也是 javaScript 的运行机制,结合这个我们再重新的分析一下上面的例子。

  • 1. 首先执宏任务(script代码 ),遇到setTimeout将其添加进宏任务的Event Queue。

  • 2. 继续往下,在执行到new Promise,打印 "promise start"。

  • 3. 在执行到resolve,.then是微任务,添加进微任务的Event Queue。

  • 4. 在执行 console.log('script end');打印 "script end"。

  • 5. 到这里本轮的宏任务就已经全部执行结束了,这时查找微任务的 Eevent Queue 是否存在可执行的微任务, 发现有刚才在第三步添加进去额度.then,执行并打印 "promise then"

  • 6. 这时第一轮的 event loop 就已经彻底结束了,下一轮 event loop 先执行一个宏任务,发现宏任务的Event Queue中有添加进去的setTimeout,执行并打印 "setTimeout start"

永远记住JavaScript是单线程,以前是、现在是、将来也会是。所有的多线程说法都是扯淡。

即使是Event Queue,也只不是实现异步的方式,也是js的执行机制。

以后能用JavaScript实现的。都将会用JavaScript来实现。

JavaScript是什么

JS是JavaScript的简称,它是一种直译式的脚本语言,其解释器被称为JavaScript引擎,是浏览器的一部分,主要用于web的开发,可以给网站添加各种各样的动态效果,让网页更加美观。

上述内容就是怎样掌握JavaScript执行机制,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网VUE频道。

--结束END--

本文标题: 怎样掌握JavaScript执行机制

本文链接: https://lsjlt.com/news/88562.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎样掌握JavaScript执行机制
    本篇文章为大家展示了怎样掌握JavaScript执行机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、为什么JavaScript是单线程如果想了解JavaScr...
    99+
    2024-04-02
  • JavaScript运行机制是怎么样的
    这篇文章主要介绍了JavaScript运行机制是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JS的运行机制1. js单线程Java...
    99+
    2024-04-02
  • JavaScript执行机制详细介绍
    目录1.进程与线程的概念 2.浏览器原理 3.同步与异步 4.执行栈与任务队列 5.事件循环(Event-Loop) 6.定时器 前言: 不论是工作还是面试,我们可能都经常会碰到需...
    99+
    2024-04-02
  • JavaScript的运行原理怎么掌握
    这篇文章主要讲解了“JavaScript的运行原理怎么掌握”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的运行原理怎么掌握”吧!了解Ja...
    99+
    2024-04-02
  • JavaScript执行机制的示例分析
    小编给大家分享一下JavaScript执行机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!进程与线程我们都知道计算机...
    99+
    2024-04-02
  • Javascript浅析执行机制的详情
    目录变量提升JavaScript 代码的执行流程编译阶段执行阶段代码中出现相同的变量或者函数怎么办变量提升 要理解变量提升,我们先从一小段代码入手: showName...
    99+
    2022-11-13
    Javascript 执行机制 Javascript 运行机制
  • javascript顺序执行是怎样的
    这篇文章主要讲解了“javascript顺序执行是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript顺序执行是怎样的”吧! ...
    99+
    2024-04-02
  • Tree-Shaking 机制快速掌握
    目录写在前面直奔主题最后写在前面 最近在读霍老师的《Vue.js设计与实现》,感觉收获很多,由于霍老师是官方Vue维护成员,会从很通俗易懂的角度去讲Vue的实现细节。而不是按照源码...
    99+
    2023-02-16
    Tree-Shaking 机制 Tree Shaking
  • php内存回收机制怎么掌握
    要掌握PHP内存回收机制,可以关注以下几个方面:1. 了解PHP的垃圾回收机制:PHP使用了基于引用计数的垃圾回收机制。当一个变量的...
    99+
    2023-09-06
    php
  • Python垃圾回收机制怎么掌握
    这篇文章主要介绍“Python垃圾回收机制怎么掌握”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python垃圾回收机制怎么掌握”文章能帮助大家解决问题。得益于 Python 的...
    99+
    2023-07-05
  • JavaScript中执行机制的示例分析
    这篇文章主要介绍JavaScript中执行机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们...
    99+
    2024-04-02
  • 关于JavaScript执行机制的面试题
    小编给大家分享一下关于JavaScript执行机制的面试题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript的特点1.JavaScript主要用来向HTML页面添加交互行为。2.JavaScript可以直接...
    99+
    2023-06-14
  • JavaScript中执行上下文和执行机制的示例分析
    这篇文章主要介绍JavaScript中执行上下文和执行机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!线程和进程说js中的执行上下文和js执行机制之前我们来说说线程和进程...
    99+
    2024-04-02
  • 一文带你掌握JavaScript中的执行上下文和作用域
    目录执行上下文执行上下文栈变量对象全局上下文函数上下文执行过程作用域静态作用域和动态作用域作用域链函数创建总结执行上下文 我们先来看段代码 var foo = function ()...
    99+
    2023-02-08
    JavaScript执行上下文 作用域 JavaScript执行上下文 JavaScript 作用域
  • 精通React需要掌握JavaScript概念是怎样的
    这篇文章给大家介绍精通React需要掌握JavaScript概念是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。想要确定一个人是否掌握React,考考他最新的JavaScript...
    99+
    2024-04-02
  • 深入理解JavaScript的事件执行机制
    目录前言 浏览器 JS 异步执行的原理 浏览器中的事件循环 执行栈与任务队列 宏任务和微任务 Async/await的运行顺序特点示例 个人分析前言 熟悉事件循环,了解浏览器运行机...
    99+
    2024-04-02
  • 如何掌握javascript流程控制结构
    今天小编给大家分享一下如何掌握javascript流程控制结构的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • V8引擎是怎样执行JavaScript代码
    V8引擎是怎样执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 题目中说到的V8引擎,大家自然会联想到No...
    99+
    2024-04-02
  • 用几道面试题来看JavaScript执行机制
    目录前面的话同步和异步开胃菜加一盘宏任务 微任务来一盘Promise再加点定时器简单测试总结前面的话 根据JavaScript的运行环境,锁定它为单线程,任务需要排队执行,如果网站资...
    99+
    2024-04-02
  • javascript中事件执行机制的示例分析
    小编给大家分享一下javascript中事件执行机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先看一段代码各位小伙...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作