首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

(ES5版)深入理解 JavaScript 执行上下文和执行栈

在函数执行上下文中,this 的值取决于该函数是如何被调用的。...译者注:外部环境已经跟 ES3 规定的作用域的作用类似 词法环境有两种类型: 全局环境(在全局执行上下文中)是没有外部环境引用的词法环境。全局环境的外部环境引用是 null。...: 声明式环境记录器存储变量、函数和参数。 对象环境记录器用来定义出现在全局上下文中的变量和函数的关系。 简而言之, 在全局环境中,环境记录器是对象环境记录器。...,其环境记录器持有变量声明语句在执行上下文中创建的绑定关系。...注意 — 在执行阶段,如果 JavaScript 引擎不能在源码中声明的实际位置找到 let 变量的值,它会被赋值为 undefined。

85710
您找到你想要的搜索结果了吗?
是的
没有找到

「查缺补漏」JavaScript执行上下文-执行栈

前言 突然觉得对于一名JavaScript开发者而言,需要知道JavaScript程序内部是如何运行的,那么对于此章节执行上下文和执行栈的理解很重要,对理解其他JavaScript概念(变量声明提示,作用域和闭包...「函数执行上下文中的变量对象内部定义的属性」,是不能被直接访问的,只有当函数被调用时,变量对象(VO)被激活为活动对象(AO)时,我们才能访问到其中的属性和方法。...ES5 执行上下文总结 对于 ES5 中的执行上下文,我们可以用下面这个列表来概括程序执行的整个过程: 程序启动,全局上下文被创建 创建 「对象环境记录器」,它持有 「变量声明语句」 在执行上下文中创建的绑定关系...(负责处理 var 定义的变量,初始值为 undefined 造成声明提升) 创建 「外部环境引用」,值为 「null」 创建 「对象环境记录器」 ,它用来定义出现在 「全局上下文」 中的变量和函数的关系...结论 执行上下文创建阶段分为绑定this,创建词法环境,变量环境三步,两者区别在于词法环境存放函数声明与const let声明的变量,而变量环境只存储var声明的变量。

54650

JavaScript执行(二):闭包和执行上下文到底是怎么回事?

环境:函数的词法环境(执行上下文的一部分); (2). 标识符列表:函数中用到的未声明的变量; 2. 表达式部分:函数体 至此,我们可以认为,JavaScript 中的函数完全符合闭包的定义。...b 表示哪个变量; 3. b 的原型是哪个对象; 4. let 把 c 声明到哪里; 5. this 指向哪个对象; 这些信息就需要执行上下文来给出了,这段代码出现在不同的位置,甚至在每次执行中,会关联到不同的执行上下文...在这两篇文章中,我会基本覆盖执行上下文的组成部分,本篇我们先讲 var 声明与赋值,let,realm 三个特性来分析上下文提供的信息,分析执行上下文中提供的信息。...var 声明与赋值 我们来分析一段代码: var b = 1 通常我们认为它声明了 b,并且为它赋值为 1,var 声明作用域函数执行的作用域。也就是说,var 会穿透 for 、if 等语句。...之后我们又从代码的角度,分析了一些执行上下文中所需要的信息,并从var、let、对象字面量等语法中,推导出了词法作用域、变量作用域、Realm的设计。

26110

从 ECMAScript 6 角度谈谈执行上下

词法环境是一种规范类型,在词法嵌套的 ECMAScript 代码中,用于定义标识符与特定变量和函数关联,也就是说JS中的变量和函数存在这个词法环境中 通常当function声明,with语句或try.....标识用于解析在此执行上下文中由代码创建的标识符引用的词法环境。...一般是let, const 声明的变量存储在该词法环境中 这里要和Lexical Environment 词法环境(中间有空格)区分一下: LexicalEnvironment 是执行上下文中的一个标识符...标识执行上下文中词法环境,其词法环境是在var声明创建绑定的词法环境,也就是这个词法环境存储的是var声明的变量 无论是LexicalEnvironment 还是LexicalEnvironment...,在执行上下文中都是词法环境。

10010

深入理解 JavaScript 中的作用域和上下

当你继续在你的编程旅程,您将意识到,您的代码的作用域有助于提高效率,帮助跟踪错误并修复它们。作用域还解决了命名问题,在不同作用域中变量名称可以相同。记住不要将作用域与上下文混淆。它们的特性不同。...每个函数都会创建自己的执行期上下文。 一旦浏览器完成了该上下文中的代码,那么该上下文将从执行期上下文中销毁,并且执行期上下文中的当前上下文的状态将被传送到父级上下文中。...在创建阶段主要做的三件事情是: 创建变量(激活)对象 创建作用域链 设置上下文(context)的值( `this` ) 变量对象 变量对象,也称为激活对象,包含在执行期上下文中定义的所有变量,函数和其他声明...05词法作用域 词法作用域意味着在一组嵌套的函数中,内部函数可以访问其父级作用域中的变量和其他资源。这意味着子函数在词法作用域上绑定到他们父级的执行期上下文。词法作用域有时也被称为静态作用域。...但是,但是它不能向其父对象反向传递,意味着变量 likes 不能被其父对象访问。这也告诉我们,在不同执行上下文中具有相同名称的变量从执行堆栈的顶部到底部获得优先级。

1.2K10

JavaScript中的闭包和执行上下文到底是怎么回事?

环境:函数的词法环境(执行上下文的一部分); (2). 标识符列表:函数中用到的未声明的变量; 2. 表达式部分:函数体 至此,我们可以认为,JavaScript 中的函数完全符合闭包的定义。...我想试着从代码实例出发,跟你一起推导函数执行过程中需要哪些信息,它们又对应着执行上下文中的哪些部分。...b 表示哪个变量; 3. b 的原型是哪个对象; 4. let 把 c 声明到哪里; 5. this 指向哪个对象; 这些信息就需要执行上下文来给出了,这段代码出现在不同的位置,甚至在每次执行中,会关联到不同的执行上下文...在这两篇文章中,我会基本覆盖执行上下文的组成部分,本篇我们先讲 var 声明与赋值,let,realm 三个特性来分析上下文提供的信息,分析执行上下文中提供的信息。...之后我们又从代码的角度,分析了一些执行上下文中所需要的信息,并从var、let、对象字面量等语法中,推导出了词法作用域、变量作用域、Realm的设计。

50820

浏览器工作原理 - 浏览器中的 JavaScript

函数调用语句时,同样会为其创建执行上下文,并将其压入调用栈 当 add 函数返回时,该函数的执行上下文就会从栈顶弹出,并将 result 的值设置为 add 函数的返回值,也就是 9 紧接着...块级作用域是一对大括号包裹的一段代码,如函数、判断语句、循环语句,甚至单独的一个 {} 都可以被看做是一个块级作用域。...函数内部通过 var 声明的变量,在编译阶段全都被存放到变量环境里面 通过 let 声明的变量,在编译阶段会被存放到 词法环境 中 在函数的作用域内部,通过 let 声明的变量并没有被存放到词法环境中...# 词法作用域 词法作用域指作用域由代码中函数声明的位置来决定的,所以词法作用域就是静态作用域,通过它能够预测代码在执行过程中如何查找标识符。...# 全局执行上下文中的 this 全局执行上下文中的 this 指向的是全局对象,即 window。

51230

编译器构造

另外,由于程序设计语言虽然是结构上是上下文无关的文法,但是实际应用中程序中每个语句并不是独立的,那么如何反应这种联系的存在,语义处理的工作就显得非常必要,它验证了语法模块之间的关联的合法性。...因此,更不能因为前边的语法错误导致后边“更多”正确的语法“出错”。基于此,错误修复算法是语法分析的另一个重点和难点。...(3)临时变量同局部变量,但不能被程序直接访问。 (4)域会对其内部声明的变量计数,以便结束时弹出其记录。 (5)不同作用域的变量声明必然不能相互访问。 ?...语句的位置 根据语法规则,break和continue 语句只能出现在循环体内部,然而语法定义中把这两种语句作为正常语句处理,所以需要在语义处理中对他们的位置进行合法性检查。...6.3 return语句返回值类型 根据语法规则,return语句可以出现在函数体的任何位置,在检测到return语句时,产生函数退出的代码。

2K80

JS词法环境和执行上下文_2023-02-24

执行上下文(Execution Context) 执行上下文是用来跟踪记录代码运行时环境的抽象概念。每一次代码运行都至少会生成一个执行上下文。代码都是在执行上下文中运行的。...你可以将代码运行与执行上下文的关系类比为进程与内存的关系,在代码运行过程中的变量环境信息都放在执行上下文中,当代码运行结束,执行上下文也会销毁。...将全局执行上下文压入执行栈,通常JS引擎都有一个指针running指向栈顶元素: 图片 JS引擎会将全局范围内声明的函数(foo)初始化在全局上下文中,之后开始一行行的执行代码,运行到console就在...running指向的上下文中词法环境中找到全局对象console并调用log函数。...declarative是较为常见的类型,通常函数声明、变量声明都会生成这种类型的ER。object类型可以由with语句触发的,而with使用场景很少,一般开发者很少用到。

41930

JS词法环境和执行上下

执行上下文(Execution Context)执行上下文是用来跟踪记录代码运行时环境的抽象概念。每一次代码运行都至少会生成一个执行上下文。代码都是在执行上下文中运行的。...你可以将代码运行与执行上下文的关系类比为进程与内存的关系,在代码运行过程中的变量环境信息都放在执行上下文中,当代码运行结束,执行上下文也会销毁。...将全局执行上下文压入执行栈,通常JS引擎都有一个指针running指向栈顶元素:图片JS引擎会将全局范围内声明的函数(foo)初始化在全局上下文中,之后开始一行行的执行代码,运行到console就在running...指向的上下文中词法环境中找到全局对象console并调用log函数。...declarative是较为常见的类型,通常函数声明、变量声明都会生成这种类型的ER。object类型可以由with语句触发的,而with使用场景很少,一般开发者很少用到。

1.3K30

js常见错误总结

带var 在私有上下文的AO变量对象中声明一个私有变量(是当前上下文的私有变量,和上下文以外没有必然联系) 不带var 浏览器发现不是私有变量,则向其上级上下文中查找(scope-chain),如果上级也没有则继续查找...(Trident内核):当前内存被其他东西引用了,则给堆计数1(累加计数),取消占用后,则减1,当减到零之后,浏览器就可以把它释放了 var与let 重复声明 在当前上下文中,不管用什么方式,只要声明了这个变量...,都不能基于let重复声明,会报错 是否重复声明,并不是在代码执行阶段检测的,而是在词法解析的阶段检测的 词法错误SyntaxError在词法解析阶段报错,当前代码不会执行 语法错误ReferenceError...暂时性死区 基于typeof 检测一个没有声明过的变量,并不会报错,结果是’undefined’ 如果这个变量在后面会用到let声明,则前面在基于typeof检测就会报错,不能声明之前使用 构造函数执行步骤...初始化作用域链 形参赋值 变量提升 首先会在当前上下文中,创建一个对象(这个对象就是当前类的实例) – 浏览器默认多做的事情 让当前上下文中的this指向新创建的对象 – 浏览器默认多做的事情 代码执行

1.8K40

Javascript中作用域的理解?

这个全局上下文附加到执行期上下文中,实际上是启动执行期上下文的第一个上下文。 之后,每个函数调用(启用)将其上下文附加到执行期上下文中。当另一个函数在该函数或其他地方被调用时,会发生同样的事情。...每个函数都会创建自己的执行期上下文 一旦浏览器完成了该上下文中的代码,那么该上下文将从执行期上下文中销毁,并且执行期上下文中的当前上下文的状态将被传送到父级上下文中。...在创建阶段主要做的三件事情是: 创建变量(激活)对象 创建作用域链 设置上下文(context)的值( this ) 变量对象 变量对象,也称为激活对象,包含在执行期上下文中定义的所有变量,函数和其他声明...这意味着子函数在词法作用域上绑定到他们父级的执行期上下文。词法作用域有时也被称为静态作用域。...但是,但是它不能向其父对象反向传递,意味着变量 likes 不能被其父对象访问。这也告诉我们,在不同执行上下文中具有相同名称的变量从执行堆栈的顶部到底部获得优先级。

88730

阶段二:浏览器中JavaScript的执行机制

引入let后,一段代码的执行流程变为: 编译并创建执行上下文: 函数内部通过var声明的变量,在编译阶段都被存放到变量环境中去了。 通过let声明的变量,在编译阶段被存放到词法环境中去了。...如何它依旧没有找到,那么JavaScript引擎就会继续在outer所指向的执行上下文中查找。 我们就把这个查找变量过程的链条称为作用域链。...词法作用域 词法作用域是指作用域是由代码中函数声明的位置来决定的,所有词法作用域是静态的作用域,通过它能够预测代码在执行过程中如何查找标识符。...在前文中,我们提到了执行上下文包含了:变量环境、词法环境、外部环境outer,这一节加上我们要分析的this,也就是四个部分。...那么,能不能设置函数内执行上下文中this的指向呢?

50730

浏览器原理学习笔记02—浏览器中的JavaScript执行机制

作用域(scope) ES6 之前作用域只有两种:全局作用域 和 函数作用域,不支持 块级作用域 (即大括号包裹的代码,如函数、判断语句、循环语句,甚至单独的一个{}),ES6 引入了 let 和 const...var 声明的变量编译阶段全都被存放到 变量环境 里,通过 let 声明的变量编译阶段会被存放到 词法环境(Lexical Environment) 中。...[g6o13oz6we.png] 4.2 词法作用域确定 outer 指向 词法作用域(静态作用域) 由代码结构(代码中函数声明的位置)决定,和函数调用关系无关。...[5fcp43toc4.png] 4.4 闭包 4.4.1 定义 在 JavaScript 中,根据词法作用域规则,内部函数 总是可以访问其 外部函数 中 声明的变量,当通过调用一个外部函数(foo)返回一个内部函数...的联系 [lkwxi2zfdv.png] 完整的执行上下文中包含了 变量环境、词法环境、外部环境outer 和 this,this 是和执行上下文绑定的(每个执行上下文包含一个 this)。

1.1K168

深入理解执行上下文和执行栈

(这里的标识符表示变量/函数的名称,变量是对实际对象【包括函数类型对象】或原始值的引用) 词法环境有三个组成部分: 环境记录:存储变量和函数声明的实际位置 对外部环境的引用:可以访问其外部词法环境 this...绑定:确定this的指向 词法环境有两种类型: 全局环境:全局执行上下文的词法环境。...函数环境:函数执行上下文的词法环境。...3.1.1.3 this绑定: 全局执行上下文中,this绑定(this binding)到全局对象(对于浏览器,该对象为window);函数执行上下文中,this绑定到谁将取决于函数的调用位置(或者说调用方法...outer: , ThisBinding: } } 随着执行阶段的进行,我们遇到了multiply(20, 30),这是一个函数调用语句

68130

听GPT 讲Rust源代码--compiler(37)

诊断信息用于在编译期间提供有关代码中可能存在的问题的详细描述,以及如何解决这些问题的建议。 该文件中定义了一些与词法分析有关的诊断信息结构体(structs)。...IncorrectUseOfAwait:表示在不正确的上下文中使用了await关键字。 IncorrectAwait:表示在不正确的语法结构中使用了await关键字。...语句是Rust中可以执行的最小单元,它们通常包含表达式、变量声明、赋值操作、函数调用等。...该文件中的主要内容可以分为以下几个部分: 语句(Stmt)结构体定义:该结构体用于表示一个语句的抽象语法树(AST)。它包含了语句的各个组成部分,比如表达式、变量声明等,以及语句的位置信息。...用于指示解析过程中当前的位置是在变量声明语句中还是在参数表达式中。

8410

理解JavaScript的作用域

作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 作用域嵌套与作用域链 当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。...这样由多个执行上下文的变量对象构成的链表就叫做作用域链。...原因是把 obj 对象传入函数内,obj 对象没有 a 属性,所以 obj.a 的值是 undefined,却在 with()语句中的 a 被当作全局变量隐式声明了,而且进行了赋值为2。...,但是出现在有多个“重复”声明的代码中,函数会首先被提升,然后才是变量。...原因: 函数声明和变量声明都会被提升,但是出现在有多个“重复”声明的代码中,函数会首先被提升,然后才是变量。 相同函数名字,后面函数覆盖前面的函数。

68220
领券