Javascript - 3

news/2025/4/3 1:35:05/文章来源:https://www.cnblogs.com/wxrwajiez/p/18804382

Javascript - 3 背后的运行原理

  • High level

  • Garbage-collected

js引擎内部的算法,为了不被不必要的东西堵塞,会从计算机内存中 自动删除旧的、未使用的对象

  • 解释型的 / 即时编译的语言(为了更快做出的调整) interpreted or just-in-time compiled

通过 解释器(Interpreter) 逐行翻译并执行代码的编程语言,它不需要预先将代码全部编译成机器码,而是直接运行源代码,边翻译边执行

  • 多范式

程序化的,面向对象的(OOP),函数式编程(FP)

命令式,声明式

  • 基于原型,面向对象的

除了原始值,js中的东西都是继承自某个原型对象的对象

Object 对象继承自 Object.prototype;Array 对象继承自 Array.prototype;Function 对象继承自 Function.prototype

  • first-class functions (函数式编程)

函数被当作变量,可以把函数传给函数,也可以让函数返回函数

  • Dynamic

  • 单线程

Do one thing at a time 只有一个主线程执行代码,同一时间只能执行一个任务

  • 非阻塞 事件循环 并发模型 Non-blocking event loop concurrency model

避免主线程阻塞

在后台执行需要长时间运行的任务,一旦完成,放回主线程

  • 跨平台

只要目标平台安装了对应的解释器,同一份代码即可运行

JS 引擎

执行js代码的程序

每个浏览器都有自己的js引擎

包含

  • 调用栈 Call Stack

代码实际 执行 的地方,执行上下文 execution context 堆叠在一起,为了跟踪程序在执行中所处的位置(栈顶就是当前代码执行的地方,当它执行完成就会从栈顶删除,执行会回到之前的执行上下文)

  • 内存堆 Memory Heap

非结构化内存池,存储对象

作用

  1. Parsing 解析:code -> AST

将每行代码分成对语言有意义的部分(const, function),然后把这些部分以结构化的方式存入树中

  1. Compilation 编译:AST -> 机器码

  2. Execution 执行

  3. Optimization 优化

为了尽快开始执行,在开始,创建一个未优化的机器码版本;在后台优化这段机器码,并在运行的程序执行期间重新编译

优化可以做很多次,在每一次优化后,未优化的代码被替换

解析,编译,优化发生在引擎内部的 无法从代码访问的 特殊线程中

JS Runtime

浏览器

Node.js

JS 执行

创建 全局执行上下文 for the top-level code(顶级代码:不在任何函数中的代码)

在最开始,只有在函数外面的代码才会被执行

执行上下文

js总是在执行上下文中执行

  • 在执行其中一段js时的环境

  • 存储所有必要信息的盒子

在任何js项目中,只有一个全局执行上下文

每个函数,在被调用时,有自己的执行上下文

执行上下文的构成

  1. 可变环境 variable environment

所有的变量(let, const, var declarations) 函数声明(functions) 和 传递的参数(arguements object) 都被存储

  1. 作用域链 scope chain

对于 函数外变量 的引用

  1. this 关键字

相反,箭头函数可以使用 来自 最近的常规父级函数的 arguements object 和 this 关键字

call stack追踪执行顺序

  1. 编译完成,顶级代码开始执行,创建全局执行上下文
  2. 全局执行上下文放入stack
  3. 函数创建自己的执行上下文,放入stack
  4. 执行完毕,弹出执行上下文

执行完毕,程序会保持在这个状态,直到真正结束(关闭浏览器选项卡或关闭浏览器窗口)

Scope Chain

Scoping: 程序的 变量 如何被 (js引擎) 组织和访问

lexical scoping 词法作用域: scoping 完全 由函数和代码块的位置控制

写在一个函数中的函数,可以访问其父函数的变量

Scope: space or environment in which a certain variable is declared

全局作用域global scope,函数作用域,块作用域

var 是函数作用域的

Scope of variables 变量的作用域: 该变量可以被访问的代码区域

变量查找

(js引擎 create Scope Chain behind the scenes)如果一个scope需要使用某个变量,但在当前scope找不到,它将在scope chain中查找,看是否能在parent scope中找到变量

变量,函数,arguements object 都是一样的

scope chain 只能向上工作,不能横向工作

Scope Chain VS Call Stack

Hoisting 提升

提升: 使变量在实际声明它们之前 可以被访问

var 会创建一个属性在全局窗口对象上

WHY TDZ

  1. 更容易避免和捕获错误
  2. 使 const 变量真正地工作

WHY HOISTING

  1. 使用函数在实际声明它之前

this 关键字

const jonas = {firstName: 'Jonas',year: 1991,calcAge: function(){console.log(2024 - this.year);// Solution 1// const self = this;// const isMillenial = function(){//     console.log(self);// }// Solution 2const isMillenial = () =>{console.log(this);}}
}

arguments 关键字

箭头函数没有 arguments 关键字

const addExpr = function(a,b){console.log(arguments);return a + b;
}
addExpr(2, 5);
addExpr(2, 5, 8, 12); // 也是合法的,只是后面传进去的两个值没有名字

原始值 VS 对象

原始值 - 原始类型 - 存储在 Call Stack(在它们声明的执行上下文中)

对象 - 引用类型 - 存储在 Heap

原始值的存储

  1. 创建 具有变量名称 的 唯一标识符

  2. 分配一块 有一个特定地址 的 内存值被存储在 这块 内存中

  3. 唯一标识符指向地址

  4. 内存中的值是不可变的,变量值改变,会分配一块新的内存,存入新的值,唯一标识符指向这个新的地址

对象的存储

  1. 对象的唯一标识符 不直接指向 存储对象的地址,而是指向一个存储对象地址的内存地址

对象可能太大无法存储在stack中,于是存储在heap中(一个几乎无限的内存池),stack只存储一个引用以便找到它

  1. 当在复制一个对象的时候,只是在创建一个指向完全相同对象的新变量

复制对象

// Copy objects
const jessica = {firstName: 'Jessica',lastName: 'Williams',age: 27,
};const jessicaCopy = Object.assign({}, jessica2); // 创建一个全新的对象
jessicaCopy.lastName = 'Davis';
console.log(jessica.lastName); // Williams
console.log(jessicaCopy.lastName); // Davis

浅拷贝:只会拷贝第一级的属性(如果有在对象中的对象,那 Object.assign() 就没用了)

深度克隆:复制所有内容(使用外部库)

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

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

相关文章

GPU学习笔记

从引言中“Dennard Scaling”的失效开始,引入GPU出现的背景,又介绍了GPU的通用性,以及高并发、低延迟保证的高计算速度。随后,我们以最常见的CUDA为例,介绍了GPU编程的基础,SIMT与SIMD,编译链接的过程。最后,我们深入硬件层面,分为三步走,先用最简系统“run起来”,然…

信创邮箱了解一下

企业微信后台,邮箱模块突然多了 【信创邮箱】这模块,让我们了解一下信创邮箱。一、信创邮箱的定义 信创邮箱,全称“信息技术应用创新邮箱”,是指基于信创全生态打造的企业邮箱服务。它遵循“信息技术安全创新”(简称“信创”)原则,采用国内自主研发的技术和方案实现信息…

小了 60,500 倍,但更强;AI 的“深度诅咒”

作者:Ignacio de Gregorio图片来自 Unsplash 的 Bahnijit Barman几周前,我们看到 Anthropic 尝试训练 Claude 去通关宝可梦。模型是有点进展,但离真正通关还差得远。 但现在,一个独立的小团队用一个只有一千万参数的模型通关了宝可梦,比主流前沿 AI 模型小了几千倍。 举个…

百度推出端到端语音大模型,支持方言、可打断、电话语音成本砍半;雷神 AI 眼镜发布:语音助理+摄像头,1799 元起丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

技术书《AI芯片开发核心技术详解》(1)、《智能汽车传感器:原理设计应用》(2)、《TVM编译器原理与实践》(3)、《LLVM编译器原理与实践》(4),谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

从准备到成交的全方位销售策略

在销售领域,成功的关键在于一系列精心策划与高效执行的步骤。以下这份销售实战指南,全面涵盖从前期准备到最终成交的全流程,旨在助力销售人员提升业绩,构建稳固的客户关系。一、充分筹备1. 夯实产品知识深入掌握产品卖点、功能、价格,并做好竞品分析。确保在与客户沟通时,…

[T.2] 团队项目:选题和需求分析

Study The Spire :卡牌肉鸽关于这款游戏​ Study The Spire 是一款富有创意的 Rougelike 卡牌游戏,将随机与卡牌构筑要素融入游戏,选择不同卡牌来构筑独特卡组来战胜敌人,精心规划你的路线,获得丰富的游戏体验,在游戏过程中你也会逐渐提升自己的专业领域知识,休闲的同时…

高性能计算-GPU并行扫描

1. 扫描概念对数组arr[N]扫描就是得到数组prefix[N],每个元素是之前arr元素的求和. 开扫描定义:prefix1[N] = { arr[0], arr[0]+arr[1], ..., arr[0]+arr[1]+arr[N-1] } 闭扫描定义: prefix2[N] = { 0, arr[0], arr[0]+arr[1], ..., arr[0]+arr[1]+arr[N-12}2. Hillis steele …

硬盘损坏盘片划伤还能恢复数据资料吗?专业数据恢复公司怎么修复

这是一块台式机电脑里的希捷4T机械硬盘,型号是ST4000DM004,是北京某单位客户寄过来的,描述说是突然损坏不识别,出现了吱吱的异响声,先在北京当地找了一家数据恢复公司做了开盘维修处理,说是盘片有损伤,难度很大,在客户前后多次支付备件服务费后,也仅仅做出了100G左右的…

B+树是如何进行查询的?

千里之行,始于足下。 —— 老子因为一个数据页中的记录是有限的,且主键值是有序的,所以通过对所有记录进行分组,然后将组号(槽号)存储到页目录,使其起到索引作用,通过二分查找的方法快速检索到记录在哪个分组,来降低检索的时间复杂度。 但是,当我们需要存储大量的记录…

使用RAGFlow和Docker部署本地知识库

随着DeepSeek的火热,大模型对与广大开发者越来越触手可及。本文介绍了使用 DeepSeek R1 模型来构建本地知识库。Ollama 管理本地模型首先要了解大模型的管理工具 Ollama:安装 OllamaOllama 官网   点击下载安装 Ollama 客户端;安装成功后打开,在终端中输入以下命令来检查是…

CherryStudio使用

一、概述 CherryStudio 是一款集多模型对话、知识库管理、AI 绘画、翻译等功能于一体的全能 AI 助手平台。 CherryStudio 高度自定义的设计、强大的扩展能力和友好的用户体验,使其成为专业用户和 AI 爱好者的理想选择。无论是零基础用户还是开发者,都能在 CherryStudio 中找到…