0

0

javascript依赖于什么支持

青灯夜游

青灯夜游

发布时间:2022-09-30 15:19:33

|

2619人浏览过

|

来源于php中文网

原创

javascript依赖于底层javascript引擎的支持。javascript运行在浏览器,主要依靠浏览器的js引擎解释执行js代码;javascript引擎是一个专门处理javascript脚本的虚拟机,一般会附带在网页浏览器之中,用于解释和执行js脚本。

javascript依赖于什么支持

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

javascript依赖于底层js引擎的支持。

javascript运行在浏览器,主要依靠浏览器的js引擎解释执行js代码。其他带有js引擎的软件也可以运行js,但是一般js和网页关系较大,所以一般在浏览器当中运行。

javascript引擎

立即学习Java免费学习笔记(深入)”;

JavaScript引擎是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中,用于解释和执行js脚本。

著名的js引擎:

    Mozilla:SpiderMonkey引擎,世界第一款JavaScript引擎,有C/C++编写,用于Mozilla Firefox 1.0~3.0版本

    Google:V8引擎,由C++/汇编语言编写,用于chrome浏览器

    微软:Chakra(查克拉,笑)引擎,用于Internet Explorer 9的32位版本

浏览器内核和JS引擎的关系

以webkit为例:

1.png

V8引擎

1、V8引擎的原理

V8引擎是用C++编写的Google开源高性能的JavaScript和WebAssembly引擎,用于Chrome和Node.js等。

它能够实现ECMAScript和WebAssembly,并在Windows7或者更高版本,macOS 10.12+和使用x64,IA-32,ARM或MIPS处理器的Linux系统上运行。

V8引擎可以独立运行,也可以嵌入到任何C++应用程序中运行。例如,可以将V8引擎中使用Node.js看做是将将V8引擎嵌入到了应用程序中,那么Node.js就具备了执行JavaScript代码的能力。

原理图:

2.png

①、Parse模块会将JavaScript代码转换成AST,这是因为解释器并不直接认识JavaScript代码。如果函数没有被调用,是不会被转换为AST的

②、Ignition是一个解释器,会将AST转换为ByteCode。同时会收集TurboFan优化所需的信息(比如函数参数的类型信息,有了类型才能真实的运算)。如果函数只调用一次,Ignition将AST转换为ByteCode

③、为什么最后转化为字节码,而不是直接转化为机器码?

因为JS代码在什么样的环境下执行并不固定,有可能是使用Windows环境、或者是mac环境、或者是Linux环境的浏览器上,也可能是在Node.js中,环境不固定,不同环境中就会有不同的CPU,不同的CPU拥有不同的CPU架构,不同的架构能够执行的机器指令是不一样的。

TayCMS免费企业建站系统1.8 for PHP
TayCMS免费企业建站系统1.8 for PHP

由于精力有限,程序更新比较慢,请大家谅解,再次感谢支持taycms的朋友们,虽然比较慢,我们还是会一直更新下去的。谢谢您的关注。有什么建议可以到论坛提出,或者直接给我QQ留言。 2.0会有很多新功能,请关注官方论坛TayCMS 1.8 升级日志此版本修复了不少BUG1.更换图片切换JS , 不会再有错误提示2.增加资料下载模块3.更换默认模版,使程序功能和页面结构更清晰,方便参考制作模版4.修复留

下载

3.png

转化为V8引擎规定好的字节码,不管在什么环境下都可以执行,是跨平台的,最后V8引擎会把字节码转化汇编指令,再转化为不同环境对应的CPU指令。

但是每次都走这套流程,还是不够方便。比如有一个函数是重复使用的,但是使用前面一套流程,每次使用这个函数的时候,都需要被转化为字节码,然后再变为CPU指令,性能比较低,如果可以直接将这个函数变为机器指令保存下来,使用这个函数的时候,直接运行机器指令,性能比较高,但是如果这个函数只运行一次,就没有必要转化变为机器代码保存下来,会浪费空间。

④、使用TurboFan库,是一个编译器,会将字节码编译为CPU可以直接执行的机器码,他可以利用ignition来收集函数的执行信息,了解到哪些函数执行次数比较多,会将这类函数标记为hot ,热函数,然后就会将这个函数转换为优化之后的机器指令,以后再使用这个热函数的时候,不需要上面繁琐的过程,直接执行机器指令就行。

但是实际上机器码也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生改变,之前优化的机器码并不能正确地处理运算,就会逆向的转换为字节码。

⑤、Deoptimization: 比如有一个函数

function  sum(num1,num2){
   num1+num2
}

调用sum函数

sum(20,30)
sum(28,30)

如果传入数字,调用sum函数,需要做的工作就是对两个数字进行相加,执行的机器指令永远是对这两个数字进行相加.
一旦改变传入值的类型,如果变成字符串,那么这个函数的意思就是两个字符串拼接。

sum("aaa","bbb")

这两种类型的传入值执行“+”操作对应的机器指令是不同的,JavaScript是不会对传入值的类型做检测的,那么还是使用数字相加的机器指令,这次函数调用的结果是不能够使用的。

但是V8引擎中提供了一种解决办法Deoptimization过程,这个过程是,一旦发现在执行机器指令时候,执行的操作不一样的时候,Deoptimization会反向优化,又转化为字节码,执行后续操作。

2、V8引擎的解析图

4.png

V8执行的细节:

①、Blink将源码交给V8引擎,Stream获取到源码并且进行编码转换

②、scanner会进行词法分析,词法分析之后会将代码转换为成tokens

③、tokens会被转换为AST树,经过Parser和PreParser:

Parser就是直接将tokens转换为AST树架构;

PreParser预解析,为什么会需要预解析?

1)如上图中的函数outer(),内部有一个函数inner(),但是并没有任何调用inner()的代码,那么就意味着并不是所有的JavaScript代码,都是一开始就被执行。对所有的JavaScript代码进行解析,必定会影响网页的运行效率。

2)V8引擎实现了Lazy Parsing(延迟解析)的方案,作用是将不必要的函数进行预解析,我只需要知道有这么个函数就行,也就是只解析暂时需要的内容,对函数的全量解析在函数被调用的时候才会执行。

3)例如上图中函数outer中的inner函数,它就是会执行预解析。

④、生成AST树之后,会被Ignition转成字节码,之后的过程就是代码的执行过程。

【相关推荐:javascript视频教程编程视频

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
node.js调试
node.js调试

node.js调试可以使用console.log()输出调试信息、断点调试和第三方调试工具。详细介绍:1、console.log()输出调试信息,通过在代码中插入console.log()语句,开发人员可以在控制台输出变量的值、函数的执行结果等信息,以便观察代码的执行流程和状态;2、断点调试,可以在代码中设置断点,以便在特定位置暂停代码的执行,观察变量的值和执行流程等。

362

2023.09.19

JavaScript 全栈开发基础(Node.js + 前端)
JavaScript 全栈开发基础(Node.js + 前端)

本专题系统介绍 JavaScript 在全栈开发中的核心知识结构,涵盖 Node.js 基础、Express/Koa 接口构建、前端交互设计、模块化与包管理、数据库连接、前后端数据通信与部署流程。通过完整项目示例,帮助学习者掌握从浏览器到服务器的一体化开发能力,实现真正意义上的全栈入门。

118

2025.11.26

Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

418

2026.02.10

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1057

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

838

2023.11.06

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号