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 语言的一个核心特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中什么是分区表?列举几个适合使用分区表的场景。

MySQL中的分区表是一种数据库设计技术,它将一个大表物理地分割成多个较小的部分,这些部分被称为分区。虽然从逻辑上看,分区表仍然像一个单独的表,但在物理层面,每个分区都是存储在一个独立的文件上,可以位于…

ARM的三个按键实验

main.c #include "key_inc.h"//封装延时函数void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}}}int main(){//按键中断初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1000);}re…

Android中的onConfigurationChanged的使用

一.什么时候调用&#xff1a; 设备配置发生变化的时候调用&#xff0c;比如&#xff1a;内外屏切换、屏幕方向&#xff08;orientation&#xff09;、键盘状态&#xff08;keyboard&#xff09;、语言环境&#xff08;locale&#xff09;、屏幕布局&#xff08;screenlayout&a…

[金三银四] 操作系统上下文切换系列

图源&#xff1a; https://zhuanlan.zhihu.com/p/540717796 文章目录 2.11 cpu 的上下文切换2.12 协程的上下文切换2.13 线程的上下文切换2.14 进程的上下文切换2.15 中断上下文切换2.16 什么时候会发生进程的上下文切换2.17 什么时候会发生线程的上下文切换2.18 什么时候会发生…

Spring AOP失效的场景

Spring AOP其实是通过动态代理实现的,那么今天要聊的这个问题就是设想什么情况不能使用动态代理,这个问题其实跟Spring事务失效的场景差不多 内部类调用 首先就是类内部的调用&#xff0c;比如一些私有方法调用&#xff0c;内部类调用&#xff0c;以及同一个类中方法的自调用…

前缀和(一)

前缀和 一维前缀和数组 假设有一个数组为a [ n ] , 另一个数组为s [ n ] . 其中 s [ j ] a[1] a[ 2 ] ......a[ j-1] a [ j ] 。--->s[ j ]表示a数组从第一个元素到第 j 个元素之和&#xff0c;那么我们则就称 s 数组为前缀和数组 例题&#xff1a;前缀和 链接&#xff1a;…

vue v-if v-show 区别

Vue中的v-if和v-show都用于控制元素的显示和隐藏&#xff0c;但它们之间存在一些关键的区别。 渲染方式&#xff1a;v-if是“惰性”的&#xff0c;这意味着在条件为假时&#xff0c;相关的组件或元素的所有事件监听器和子组件都会被销毁&#xff0c;不会渲染到DOM中。只有当条…

遥感原理与应用—绪论

一、关于基本概念与对应的英文 遥感&#xff1a;Remote Sensing 遥测&#xff1a;Telemetry&#xff0c;对被测物体某些运动参数和性质进行远距离测量的技术&#xff0c;分为接触测量与非接触测量&#xff0c;对于RS的概念&#xff0c;遥测探测的目标显得狭隘了一些&#xff…

AI女朋友 -- 一个傲娇女友,嘴上刻薄但内心关心你

文章目录 前言一、成果展示 1、ai女友2、留言板二、实现思路三、难点问题四、总结 前言 在免费API寻找过程中&#xff0c;发现了ai女友的接口&#xff0c;打算从这个接口入手&#xff0c;做出给人一种有女朋友的、温柔的、亲近的、容易给的感觉&#xff01; 一、成果展示 1、A…

Git bash获取ssh key

目录 1、获取密钥 2、查看密钥 3、在vs中向GitHub推送代码 4、重新向GitHub推送修改过的代码 1、获取密钥 指令&#xff1a;ssh-keygen -t rsa -C "邮箱地址" 连续按三次回车&#xff0c;直到出现类似以下界面&#xff1a; 2、查看密钥 路径&#xff1a;C:\U…

Kubernetes概念:工作负载:工作负载管理:2. ReplicaSet

ReplicaSet ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此&#xff0c;它通常用来保证给定数量的、完全相同的 Pod 的可用性。 ReplicaSet 的工作原理 ReplicaSet 是通过一组字段来定义的&#xff0c;包括一个用来识别可获得的 Pod 的集…

FreeCAD傻瓜教程之基准面的构建-在实体的表面上新建坐标、倾斜的平面、附加不同的台阶、旋转体等

目的&#xff1a;学会在已有模型的不同剖面上建立新的坐标系&#xff0c;并绘图&#xff1b;使得新图形仍然作为同一个零件实体的构件。 零、需求举例 在下列模型中&#xff0c;我们要在圆杆的顶部增加一个把手&#xff0c;如果点击圆杆顶部&#xff0c;则仅能在顶部圆形所在…

JVM虚拟机栈

虚拟机栈 虚拟机栈概述 栈是运行时的单位&#xff0c;而堆是存储的单位。 栈解决程序的运行问题&#xff0c;即程序如何执行&#xff0c;或者说如何处理数据。堆解决的是数据存储的问题&#xff0c;即数据怎么放&#xff0c;放在那儿。 虚拟机栈的基本内容 Java虚拟机栈 Java…

瑞吉外卖实战学习--登录功能的开发

登录功能的开发 前端1、创建实体类Employee和employee表进行映射,可以直接导入资料中提供的实体类1.1、字段名称对应上&#xff0c;有下划线的使用驼峰对应&#xff0c;因为在配置文件中进行了配置1.2、employee 文件 2、创建Controller、Service、Mapper2.1、Mapper文件2.2、定…

Windows复现SiamCAR代码遇到的报错与解决方法

一、环境基础 Windows10以上 已装Anaconda 支持GPU 已经gitclone:https://github.com/HonglinChu/SiamTrackers 二、遇到的报错 1. No module named pycocotools._mask 方案一&#xff1a;加载非常慢 conda install -c conda-forge pycocotools 方…

蓝桥杯竞赛规则及说明【C/C++】

第十五届蓝桥杯全国软件和信息技术专业人才大赛个人赛规则解析 一、组别划分 本次大赛C/C和Java两个语言分别设有四个组别:研究生组、大学A组、大学B组和大学C组。选手只能选择参加其中一个组别的竞赛,各组评奖独立进行。 组别资格对应如下: 研究生组:只限研究生参加大学A组…

vite打包配置基础

Vite&#xff1a;优化前端打包的利器 Vite&#xff08;法语意为“快速”&#xff09;是由 Vue.js 之父尤雨溪开发的一款现代化的前端构建工具&#xff0c;其设计目标是通过提供更快的冷启动速度、更高效的热更新和智能的按需编译打包机制&#xff0c;极大地提升前端开发体验。…

智慧物联-能源分析平台

物联能源分析平台是为了满足企业对能源管理和节能减排的需求而开发的一套在线平台。随着能源问题日益凸显&#xff0c;企业对能源的使用和管理面临着越来越大的挑战。因此&#xff0c;开发一个能够帮助企业实时监测、分析和优化能源消耗的平台变得尤为重要。 随着工业化和城市…

Java-JVM指令

JVM指令 1. 栈和局部变量操作 1.1 将常量压入栈的指令aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型…