首页 > 其他分享 >js一些底层

js一些底层

时间:2024-03-24 10:32:31浏览次数:19  
标签:执行 作用域 代码 JavaScript js 编译器 一些 上下文 底层

简介:
JavaScript 是一种高级编程语言,通常在网页开发中用于前端和后端开发。JavaScript 的底层实现是浏览器或服务器上的 JavaScript 引擎。不同的引擎可能有不同的底层实现,但它们都有一个共同的目标,即执行 JavaScript 代码。
JavaScript 的底层实现涉及到多个方面,包括解释器、编译器、内存管理、执行上下文、作用域链等。以下是 JavaScript 底层的详细解释

解释器和编译器:
解释器:JavaScript 引擎中的解释器负责解析和执行 JavaScript 代码。它逐行读取源代码,将其翻译成机器代码并执行。解释器通常用于快速启动和执行代码。
编译器:某些 JavaScript 引擎包括编译器,用于将 JavaScript 代码转换成优化的中间代码或直接编译成本地机器代码。这样可以提高执行速度。V8 引擎就包括了一个即时编译器(Just-In-Time Compiler,JIT),它将 JavaScript 代码编译成机器代码以提高性能。

执行上下文:
执行上下文是 JavaScript 引擎用来跟踪代码执行的上下文信息。每当函数被调用时,都会创建一个新的执行上下文。执行上下文包含了当前函数的变量、作用域链、this 指向等信息。这些信息在代码执行期间被使用,以确保正确的变量访问和函数调用

作用域链:
作用域链是执行上下文中的一个关键概念。它用于查找变量和函数的定义。当 JavaScript 代码在一个作用域中引用一个变量时,引擎会从当前执行上下文的变量对象开始查找,如果找不到,则会继续向上查找作用域链,直到找到或者达到全局作用域

内存管理:
avaScript 引擎负责管理内存。它使用垃圾回收机制来检测和回收不再使用的对象,以防止内存泄漏。垃圾回收器会定期扫描内存,标记不再引用的对象,并将其释放

APIs(在浏览器环境中):
JavaScript 可以与浏览器提供的各种 API 进行交互,包括 DOM 操作、Ajax 请求、Canvas 绘图等。这些 API 允许 JavaScript 与用户界面和网络进行交互,实现丰富的前端功能。

总而言之,JavaScript 的底层实现是一个复杂的系统,它涉及多个组件和机制,用于解释、执行和优化 JavaScript 代码。不同的 JavaScript 引擎可能在底层实现上有所不同,但它们都遵循了 JavaScript 语言规范,以确保代码在不同环境中的一致性和可移植性。这些底层机制和概念共同使 JavaScript 成为一门功能强大的编程语言。

详解:
解释器和编译器:
解析器(Parser):
解析器是 JavaScript 引擎的一部分,它负责将源代码字符串转化为抽象语法树(AST)。AST 是一个树状结构,表示了代码的语法结构,包括变量声明、函数定义、表达式等。
解析器执行的过程包括词法分析(Lexical Analysis)和语法分析(Syntax Analysis):
词法分析:解析器将源代码字符串分割成词法单元(tokens),例如标识符、运算符、数字、字符串等。这些词法单元是语法分析的基本单位。
语法分析:解析器使用词法单元构建抽象语法树,根据语法规则验证代码的合法性。如果代码不符合语法规则,解析器会抛出语法错误。

编译器(Compiler):
编译器是 JavaScript 引擎的另一部分,它负责将 AST 编译成可执行代码。编译器的工作包括优化和生成目标代码的阶段:
优化:某些 JavaScript 引擎包括一个即时编译器(Just-In-Time Compiler,JIT),它会对 AST 进行优化,尝试将代码转化为更高效的中间代码或直接编译成本地机器代码,以提高执行速度。
生成目标代码:编译器将优化后的代码转化为目标代码,这可以是中间代码,也可以是机器代码(取决于引擎的实现)。目标代码可以由解释器执行或由底层硬件执行。
总结起来,解析器和编译器的工作流程如下:

解析器接收 JavaScript 源代码字符串,并将其分析成词法单元。
解析器使用语法规则将词法单元构建成抽象语法树(AST)。
编译器接收 AST,并可能对其进行优化。
编译器将优化后的代码生成目标代码,可以是中间代码或机器代码。
最终,目标代码由解释器或底层硬件执行,实现 JavaScript 代码的功能。

不同的 JavaScript 引擎可能有不同的解析器和编译器实现,以及不同的优化策略,这些差异可以影响代码的执行性能。一些引擎,如 V8(Chrome 的 JavaScript 引擎),在性能方面非常出色,通过 JIT 编译技术和优化算法来加速 JavaScript 代码的执行。

执行上下文
全局执行上下文(Global Execution Context):
当 JavaScript 代码首次加载时,会创建一个全局执行上下文。这是整个程序的最顶层执行上下文,它负责管理全局范围的变量和函数。全局执行上下文通常只有一个,在整个程序的生命周期中存在。

函数执行上下文(Function Execution Context):
每当函数被调用时,都会创建一个新的函数执行上下文。这个执行上下文与函数相关联,包括了函数的参数、局部变量和内部函数。
每个函数执行上下文都有自己的作用域链,用于查找变量和函数的定义。
函数执行上下文的数量可以随着函数的嵌套调用而增加,每个函数执行上下文都有自己的活动记录(Activation Record)。

作用域链(Scope Chain):
执行上下文中的作用域链是一个包含变量对象的链条,用于查找变量和函数的定义。它从当前执行上下文的变量对象开始,然后逐级向外部执行上下文的变量对象查找,直到找到或达到全局执行上下文。
作用域链的目的是实现词法作用域,即变量的作用域由代码的静态结构决定,而不受运行时条件的影响。

变量对象(Variable Object):
每个执行上下文都有一个与之关联的变量对象,用于存储变量和函数的定义。全局执行上下文的变量对象称为全局对象(Global Object)。
变量对象包括了函数的参数、函数内部声明的变量(包括函数声明)以及在该作用域内可访问的全局变量。

this 指向:
执行上下文还包括了一个 this 指向,它指示了当前代码片段所属的对象。在全局执行上下文中,this 指向全局对象(通常是 window 对象),而在函数执行上下文中,this 的值取决于函数的调用方式。

执行阶段:
执行上下文有两个阶段:创建阶段(Creation Phase)和执行阶段(Execution Phase)。
在创建阶段,变量对象被设置,函数声明被提升,作用域链被创建。
在执行阶段,JavaScript 代码逐行执行,变量分配、函数调用等操作都发生在这个阶段。

销毁执行上下文:
当函数执行结束时,或者全局代码执行完成时,相应的执行上下文会被销毁,释放相关的内存和资源。

了解执行上下文的工作原理是理解 JavaScript 作用域、变量生命周期和函数调用的关键。不同的执行上下文之间相互嵌套,并且通过作用域链形成了变量的访问路径,这是 JavaScript 语言的一个核心特性。

标签:执行,作用域,代码,JavaScript,js,编译器,一些,上下文,底层
From: https://blog.csdn.net/xiaohua0708day/article/details/136983182

相关文章

  • React&Nest.js社区平台(四)——✏️文章发布与管理实战
    公众号:【可乐前端】,每天3分钟学习一个优秀的开源项目,分享web面试与实战知识。前言在上一期我们已经实现了个人信息模块,这一期来实现文章发布与管理。涉及到如下功能:草稿创建/修改文章发布文章删除获取我发布的文章看起来像是文章的增删改查功能,其实还是有不少值得思考......
  • 【附源码】Node.js毕业设计高校拼车系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着社会的发展与科技的进步,人们对于出行方式的需求日益多样化,尤其是在高校校园内,学生、教职工等群体的出行需求频繁而复杂。传统的出行方式如步行、自行车......
  • 【附源码】Node.js毕业设计高校排课系统设计(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,高校教育管理逐渐向数字化、智能化方向迈进。在这一背景下,高校排课系统作为教育管理的重要组成部分,其优化与改进显得尤为重要。传统......
  • vue2 在 main.js 中定义全局函数,在二次封装的 api\index.js 中引用全局函数 GPT4 Tur
    在Vue2中,你可以通过Vue的原型系统来定义全局函数,然后在整个应用的任何组件中使用这些函数。同样,你也可以在其他JavaScript文件中使用这些函数,比如你提到的二次封装的API文件。下面是如何实现这一过程的步骤:###第一步:在`main.js`中定义全局函数在Vue项目的入口文件`main.js`中,你......
  • 快速上手 Vue.js 框架:初学者指南
    快速上手Vue.js框架:初学者指南Vue.js是一个轻量级且灵活的JavaScript框架,专为构建交互式的Web界面而设计。它的设计哲学是使得开发者可以轻松上手,同时提供强大的功能来构建复杂的单页应用(SPA)。如果你是前端开发的新手,或者想要学习一种新的框架来提升你的技能,那么Vu......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......
  • nodejs学习
    什么是nodejs就是一个基于chormeV8引擎的JavaScript运行环境,是一个用于后端的运行环境nodejs中的运行环境分为两部分,分别是V8引擎和内置Api,前者用于解析js,后者用于被js调用终端的概念 虽然用的很多,但一讨论他的概念,我倒是有点说不上来:终端,是专门为开发人员设计的,用于实现人......
  • Ajax、JSON、响应式设计和Node.js
    Ajax、JSON、响应式设计和Node.js股票搜索(AJAX/JON/HTML5/Bootstrap/Angular/Node.js/CloudExercise)1.目标●熟悉AJAX和JSON技术●在客户端使用HTML5、Bootstrap和Angular的组合●在服务器端使用Node.js●熟悉Bootstrap,使用响应式设计增强用户体验●亲身体验云服务托......
  • [nodejs] pm2 : nodejs 的进程管理工具
    0pm2概述0.1序0.2pm2简述PM2是一款非常优秀的Node进程管理工具,它有着丰富的特性:能够充分利用多核CPU且能够负载均衡、能够帮助应用在崩溃后、指定时间(clustermodel)和超出最大内存限制等情况下实现自动重启。PM2是开源的基于Nodejs的应用进程管理器,包括守护进......
  • Json扩展方法
    命名空间:点击查看代码usingNewtonsoft.Json;usingNewtonsoft.Json.Linq;usingSystem;usingSystem.IO;usingSystem.Linq;类:点击查看代码///<summary>///Json扩展方法///</summary>publicstaticclassJsonExtends{privates......