iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >JavaScript引擎怎么执行JS代码
  • 303
分享到

JavaScript引擎怎么执行JS代码

2024-04-02 19:04:59 303人浏览 独家记忆
摘要

这篇文章主要为大家展示了“javascript引擎怎么执行js代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript引擎怎么执行JS代码”这篇文

这篇文章主要为大家展示了“javascript引擎怎么执行js代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript引擎怎么执行JS代码”这篇文章吧。

JS代码的运行

我们知道了js是弱类型语言,在运行时才确定变量类型。js引擎在执行js代码时,也会从上到下进行 词法分析语法分析语义分析 等处理,并在代码解析完成后生成AST(抽象语法树),最终根据AST生成CPU可以执行的机器码并执行。

除此之外,JS引擎在执行代码时还会进行其它处理,如 V8 中还有两个阶段:

  • 编译阶段:该阶段会进行执行上下文的创建,包括创建变量对象(VO)(此时会被初始化为undefined)、建立作用域链、确定 this 指向等。每进入一个不同的运行环境。V8 都会创建一个新的执行上下文。

  • 执行阶段:将编译阶段中创建的执行上下文压入调用栈,并成为正在运行的执行上下文。代码执行结束后,将其弹出调用栈。(这里有一个VO - AO的过程:JavaScript对变量赋值时变量被用到,此时变量对象会转为活动对象,转换后的活动对象才可被访问)

这就引出了两个概念:“执行上下文” 和 “作用域链”。


JavaScript执行上下文

由上面我们可以知道:当js代码执行一段可执行代码时,会创建对应的执行上下文。
首先,js中可执行代码对应着有一个概念:“执行环境” —— 全局环境、函数环境 和 eval
其次,对于每个执行上下文,都有三个重要属性:

  • 变量对象(即“VO”)

  • 作用域链

  • this

我们来看两段代码:

var scope="global scope";function checkscope(){
	var scope="local scope";
	function f(){
		return scope;
	}
	return f();}checkscope();
var scope="global scope";function checkscope(){
	var scope="local scope";
	function f(){
		return scope;
	}
	return f;}checkscope()();

它们会打印什么?
JavaScript引擎怎么执行JS代码

为什么?答案是它们的执行上下文栈不一样!

什么是“执行上下文栈”?
当执行一个可执行代码时,就会提前做准备工作,这里的“准备工作”,专业的说法就是“执行上下文”。但随着可执行代码如函数的增多,如何管理那么多的执行上下文呢?所以JS引擎创建了执行上下文栈的概念。
我们完全可以用数组去模拟其行为(栈底永远有一个全局执行上下文globalContext)

我们定义一个EStack,首先

EStack=[globalContext];

然后来模拟第一段代码:

EStack.push(<checkscope> functionContext);EStack.push(<f> functionContext);EStack.pop();EStack.pop();

而第二段代码是这样的:

EStack.push(<checkscope> functionContext);EStack.pop();EStack.push(<f> functionContext);EStack.pop();

究其原因,你可能需要先研究一下“闭包”的概念了!

这里顺便说下“在前端模块化”中怎么实现“长时间保存数据”?
缓存?不。闭包!


JavaScript作用域和作用域链

首先,作用域是指程序中定义变量的区域。作用域规定了如何查找变量,也就是确定了当前执行代码对变量的访问权限。
作用域有两种:静态作用域动态作用域
JS采用的静态作用域,也叫“词法作用域”。函数的作用域在函数定义的时候就确定了。

由上,词法作用域中的变量,在编译过程中会产生一个确定的作用范围。这个作用范围即“当前的执行上下文”。在ES5后我们用“词法环境”替代作用域来描述该执行上下文。词法环境由两个成员组成:

  • 自身词法环境记录:用于记录自身词法环境中的变量对象

  • 外部词法环境引用:用于记录外层词法环境中存在的引用

我们依然来看一个例子:

var value=1;function foo(){
	console.log(value);}function bar(){
	var value=2;
	foo();}bar();

回看上面的定义,该打印什么?

JavaScript引擎怎么执行JS代码

让我们分析下执行过程:
执行foo()函数,先从foo函数内部查找是否有局部变量value。如果没有,就根据定义时的位置,查找上面一层的代码,也就是value=1.所以结果会打印1。

这里面当然不是如此简单能概括的,你可以从执行上下文的角度分析一下。

建立作用域链

上面我们说了词法环境(作用域)的两个组成。再结合执行上下文,我们不难发现:通过外部词法环境的引用,作用域可以顺着栈层层拓展,建立起从当前环境向外延伸的一条链式结构。

再来看一个例子:

function foo(){
	console.dir(bar);
	var a=1;
	function bar(){
		a=2;
	}}console.dir(foo);foo();

由静态作用域,全局函数foo创建了一个自身对象的 [[scope]] 属性

foo[[scope]]=[globalContext];

而当我们执行foo()时,也会先后进入foo函数的定义期和执行期。在foo函数的定义期时,函数bar的 [[scope]] 将会包含全局内置scope和foo的内置scope

bar[[scope]]=[fooContext,globalContext];

这证明了这一点:“JS会通过外部词法环境引用来创建变量对象的一个作用域链,从而保证对执行环境有权访问的变量和函数的有序访问。”

让我们再回头看看执行上下文中的那道题,在前面我们说了它们有什么不同,这里说下为什么它们相同地打印了“local scope”:还是那句话“JS采用的是词法作用域,函数的作用域取决于函数创建的位置” —— JS函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量scope一定是指局部变量,不管何时何地执行 f() ,这种绑定在执行 f() 时依然有效。

基于作用域链的变量查询

当某个变量无法在自身词法环境记录中找到时,可以根据外部词法环境引用向外层进行寻找,直到最外层的词法环境中外部词法环境引用为null
与此相似的是“对象中基于原型链的查找”:

  • 原型:每一个JS对象(null 除外)在创建时就会与另一个对象关联,这个对象就是我们说的原型。每一个对象都会从原型中“继承”属性。

  • 当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还找不到,就去找原型的原型,一直到最顶层(__proto__为null)为止

它们的区别也显而易见:原型链是通过 prototype 属性建立对象继承的链接;而作用域链是指内部函数能访问到外部函数的闭包。不管直接还是间接,所有函数的作用域链最终都链接到全局上下文。

以上是“JavaScript引擎怎么执行JS代码”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: JavaScript引擎怎么执行JS代码

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript引擎怎么执行JS代码
    这篇文章主要为大家展示了“JavaScript引擎怎么执行JS代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript引擎怎么执行JS代码”这篇文...
    99+
    2024-04-02
  • V8引擎是怎样执行JavaScript代码
    V8引擎是怎样执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 题目中说到的V8引擎,大家自然会联想到No...
    99+
    2024-04-02
  • V8引擎如何执行JavaScript代码
    V8引擎如何执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。题目中说到的V8引擎,大家自然会联想到Node.js。我们先看一下官方对Node.js的定...
    99+
    2023-06-16
  • JS引擎执行流程是怎样的
    这篇文章给大家介绍JS引擎执行流程是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言我强烈推荐的原因在于:在用动图的形式生动形象的讲述了JavaScript引擎基本原理。接触了...
    99+
    2024-04-02
  • Python中怎么执行js代码
    这篇文章将为大家详细讲解有关Python中怎么执行js代码,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。正常代码我们现在看一段js代码,代码逻辑很简单,就是拼接时间返回。function&n...
    99+
    2023-06-16
  • 详解JavaScript引擎V8执行流程
    目录一、V8来源二、V8的服务对象三、V8的早期架构四、V8早期架构的缺陷五、V8的现有架构六、V8的词法分析和语法分析七、V8 AST抽象语法树八、字节码九、Turbofan一、V...
    99+
    2024-04-02
  • Node.js V8 引擎与代码缓存:提高 JavaScript 执行速度的利器
    代码缓存 代码缓存是一种优化技术,可存储 JavaScript 代码的编译版本,以便在后续执行时快速访问。这提高了 JavaScript 代码的执行速度,因为它消除了编译代码的开销,尤其是对于经常执行的代码段。 V8 引擎与代码缓存的协同...
    99+
    2024-04-02
  • 怎么在python中执行js代码
    本篇文章为大家展示了怎么在python中执行js代码,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是js代码混淆我们现在看一段js代码,代码逻辑很简单,就是拼接时间返回。function&nbs...
    99+
    2023-06-15
  • jsp中怎么执行javascript代码
    这篇文章主要介绍了jsp中怎么执行javascript代码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jsp中怎么执行javascript代码文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • hive中怎么设置执行引擎
    在Hive中,默认情况下使用的是Tez执行引擎。但是你可以通过以下方式来设置不同的执行引擎: 使用Hive CLI或Beeline...
    99+
    2024-04-02
  • 在Chrome中怎么执行JavaScript代码
    这篇“在Chrome中怎么执行JavaScript代码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“在Chrome中怎么执行...
    99+
    2023-06-29
  • 深入理解JVM字节码执行引擎
    我们都知道,在当前的Java中(1.0)之后,编译器讲源代码转成字节码,那么字节码如何被执行的呢?这就涉及到了JVM的字节码执行引擎,执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致:输入:字节码文件处理:字节码解...
    99+
    2023-06-02
  • JavaScript函数内部的代码怎么执行
    这篇文章主要介绍“JavaScript函数内部的代码怎么执行”,在日常操作中,相信很多人在JavaScript函数内部的代码怎么执行问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • V8是怎么执行一段JavaScript代码的
    这篇文章主要讲解了“V8是怎么执行一段JavaScript代码的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“V8是怎么执行一段JavaScript代码的”吧!编译器和解释器之所以存在编译器...
    99+
    2023-07-06
  • 怎么在JavaScript函数内执行全局代码
    本篇内容主要讲解“怎么在JavaScript函数内执行全局代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在JavaScript函数内执行全局代码”吧!先...
    99+
    2024-04-02
  • 好程序员web前端分享JS引擎的执行机制
      好程序员web前端分享JS引擎的执行机制,请先着重牢记两点!JS是单线程语言。   JS的EventLoop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的eventloop。   1、灵魂三问:JS为什...
    99+
    2023-06-03
  • 怎么在JavaScript脚本中执行java后台代码
    怎么在JavaScript脚本中执行java后台代码,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用场景:关闭页面弹窗时执行...
    99+
    2024-04-02
  • 实现在 Chrome 中执行 JavaScript 代码
    目录一、打开开发者工具1.右键“检查”2.快捷键F123.菜单进入二、开发者工具中执行JavaScript代码1.Console窗口执行2.Snippet脚本...
    99+
    2024-04-02
  • html怎么运行js代码
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-16
  • JavaScript 引擎的运行原理是什么
    这篇文章将为大家详细讲解有关JavaScript 引擎的运行原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。注意:本文主要基于 Node.js 和基...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作