摘要:一执行上下文概念当函数执行时,会创建一个称为执行上下文的内部对象可理解为作用域。一个执行上下文定义了一个函数执行时的环境。三变量对象概念变量对象是与执行上下文相关的数据作用域。阅读更多参考文章了解的执行上下文论代码执行上下文
一、执行上下文 1.1 概念
当函数执行时,会创建一个称为执行上下文的内部对象(可理解为作用域)。一个执行上下文定义了一个函数执行时的环境。二、产生执行上下文的两个阶段
(1)在JavaScript解释器内部,每次调用执行上下文,分为两个阶段,①创建阶段 和 ②激活/代码执行阶段。
2.1 创建阶段第一阶段是创建阶段,(当函数被调用,但未执行任何其内部代码之前)。在创建阶段主要做三件事:
(1)创建作用域链(Scope Chain)。
(2)创建变量对象(函数的形参、函数声明、变量声明)。
(3)求”this“的值。
当调用foo(22)时,创建状态如下所示
2.2 激活/代码执行阶段(1)创建状态负责处理定义属性的名字,不为其指派具体的值,以及形参/实参的处理。
(2)一旦创建阶段完成,执行流进入函数并且激活/代码执行阶段,Execution Context object就会更新。
2.3 三个属性(1)对于每个执行上下文(Execution Context)都有三个重要的属性,①变量对象(Variable object,VO),②作用域链(Scope chain)和 ③this。
三、变量对象(Variable Object) 3.1 概念(1)变量对象(variable object) 是与执行上下文相关的 数据作用域(scope of data) 。
(2)VO是与上下文关联的特殊对象,用于存储被定义在上下文中的 变量(variables) 和 函数声明(function declarations) 。
(3)VO是一个抽象的概念,不同的上下文中,它表示使用不同的object。例如,在global全局上下文中,变量对象也是全局对象自身[global object]。(这就是我们可以通过全局对象的属性来指向全局变量)。
3.2 初始化过程进入执行上下文时,VO的初始化过程具体如下:
(1)函数的形参(当进入函数执行上下文时) 变量对象的一个属性,其属性名就是形参的名字,其值就是实参的值;对于没有传递的参数,其值为undefined。
(2)函数声明(FunctionDeclaration, FD) 变量对象的一个属性,其属性名和值都是函数对象创建出来的;如果变量对象已经包含了相同名字的属性,则替换它的值。
(3)变量声明(var,VariableDeclaration) 变量对象的一个属性,其属性名即为变量名,其值为undefined;如果变量名和已经声明的函数名或者函数的参数名相同,则不会影响已经存在的属性。
四、活动对象(Activation object)(1)只有全局上下文的变量对象允许通过VO的属性名称间接访问;
(2)在函数执行上下文中,VO是不能直接访问的,此时由激活对象(Activation Object,缩写为AO)扮演VO的角色。
(3)激活对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。
五、VO和AO的关系对于VO和AO的关系可以理解为,VO在不同的Execution Context中会有不同的表现:当在**Global Execution
Context中,可以直接使用VO;但是,在函数Execution Context中,AO**就会被创建。
阅读更多
参考文章
了解JavaScript的执行上下文
JavaScript 论代码执行上下文
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95039.html
摘要:什么是中的调用栈调用栈就像是程序当前执行的日志。当函数执行结束时,将从调用栈中出去。了解全局和局部执行上下文是掌握作用域和闭包的关键。总结引擎创建执行上下文,全局存储器和调用栈。 原文作者:Valentino 原文链接:https://www.valentinog.com/blog/js-execution-context-call-stack 什么是Javascript中的执行上下文...
摘要:深入系列第七篇,结合之前所讲的四篇文章,以权威指南的为例,具体讲解当函数执行的时候,执行上下文栈变量对象作用域链是如何变化的。前言在深入之执行上下文栈中讲到,当代码执行一段可执行代码时,会创建对应的执行上下文。 JavaScript深入系列第七篇,结合之前所讲的四篇文章,以权威指南的demo为例,具体讲解当函数执行的时候,执行上下文栈、变量对象、作用域链是如何变化的。 前言 在《Jav...
摘要:深入系列第三篇,讲解执行上下文栈的是如何执行的,也回答了第二篇中的略难的思考题。 JavaScript深入系列第三篇,讲解执行上下文栈的是如何执行的,也回答了第二篇中的略难的思考题。 顺序执行? 如果要问到 JavaScript 代码执行顺序的话,想必写过 JavaScript 的开发者都会有个直观的印象,那就是顺序执行,毕竟: var foo = function () { ...
摘要:执行上下文当代码运行的时候,运行代码的环境形成了执行上下文,执行上下文决定代码可以访问哪些变量函数对象等。我们将执行上下文简单视为运行当前代码的,我们知道作用域分为和。完成后,其执行堆栈将从堆栈中删除,将控制权交给全局执行上下文。 我们通常将 JavaScript 归类为动态或解释执行语言,但实际上它也是一门编译语言,它有自己的编译器形式,运行在 JavaScript 引擎中。 每个 ...
摘要:深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。定义对闭包的定义为闭包是指那些能够访问自由变量的函数。 JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那什么是自由变量呢? 自由变量是指在函数中使用的,但既不是函数参数也...
摘要:执行上下文和执行栈是中关键概念之一,是难点之一。理解执行上下文和执行栈同样有助于理解其他的概念如提升机制作用域和闭包等。函数执行完成,函数的执行上下文出栈,并且被销毁。 前言 如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制。执行上下文和执行栈是JavaScript中关键概念之一,是Ja...
阅读 709·2021-11-24 10:19
阅读 1081·2021-09-13 10:23
阅读 3406·2021-09-06 15:15
阅读 1751·2019-08-30 14:09
阅读 1655·2019-08-30 11:15
阅读 1819·2019-08-29 18:44
阅读 901·2019-08-29 16:34
阅读 2437·2019-08-29 12:46