首页
学习
活动
专区
工具
TVP
发布

JS词法环境和执行上下文

如果要成为一名优秀的JS开发者,那么对JavaScript程序的内部执行原理要有所了解。本文以最新的ECMA规范中的第八章节为基础,理清JavaScript的词法环境和执行上下文的相关内容。...而执行栈(Execution Context Stack)是用来管理执行期间创建的所有执行上下文的数据结构,它是一个LIFO(后进先出)的栈,它也是我们熟知的JS程序运行过程中的调用栈。...将全局执行上下文压入执行栈,通常JS引擎都有一个指针running指向栈顶元素:图片JS引擎会将全局范围内声明的函数(foo)初始化在全局上下文中,之后开始一行行的执行代码,运行到console就在running...运行到foo()时,识别为函数调用,此时创建一个新的执行上下文FooContext并入栈,将FooContext内词法环境的outer引用指向全局执行上下文的词法环境,移动running指针指向这个新的上下文...总结本文关于执行上下文的理论知识比较多,不容易马上吸收理解,建议你逐渐消化、反复阅读理解。当你熟悉了执行上下文和词法环境,相信去理解认识更多JS特性和概念时,会更加轻松容易。

1.2K30

【译】JS的执行上下文环境栈是什么?

这篇文章中,我将深入探讨JavaScript中的一个最基本的部分,即执行上下文(或称环境)。...执行上下文是什么? 在运行JavaScript代码时,执行环境非常重要,并可以认为是以下其中之一: 全局代码 - 默认环境,你的代码第一时间在这里执行。 函数代码 - 当执行流进入函数体的时候。...我们把术语执行上下文视为当前代码的评估环境/范围。现在,条件充足,我们看个包含全局和函数/本地上下文评估代码的示例。...理解执行上下文环境栈可以让你了解代码的评估和你预期不同值的原因。 你是认为了解解释器的内部工作原理是多余的还是必要的JavaScript知识点呢?...知道执行上下文是否有助你编写出更好的JavaScript? 笔记:有些人一直在询问闭包,回调,timeout等知识点,我将在下一篇文章中介绍,更多地关注与执行环境相关的作用域链。

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

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

如果要成为一名优秀的JS开发者,那么对JavaScript程序的内部执行原理要有所了解。 本文以最新的ECMA规范中的第八章节为基础,理清JavaScript的词法环境和执行上下文的相关内容。...而执行栈(Execution Context Stack)是用来管理执行期间创建的所有执行上下文的数据结构,它是一个LIFO(后进先出)的栈,它也是我们熟知的JS程序运行过程中的调用栈。...将全局执行上下文压入执行栈,通常JS引擎都有一个指针running指向栈顶元素: 图片 JS引擎会将全局范围内声明的函数(foo)初始化在全局上下文中,之后开始一行行的执行代码,运行到console就在...图片 执行上下文的创建 执行上下文创建会做两件事情: 创建词法环境LexicalEnvironment; 创建变量环境VariableEnvironment; 因此一个执行上下文在概念上应该是这样子的:...总结 本文关于执行上下文的理论知识比较多,不容易马上吸收理解,建议你逐渐消化、反复阅读理解。当你熟悉了执行上下文和词法环境,相信去理解认识更多JS特性和概念时,会更加轻松容易。

41230

JS 执行上下文

理解执行上下文 执行上下文(Execution Context): 函数执行前进行的准备工作(也称执行上下文环境) 运行JavaScript代码时,当代码执行进入一个环境时,就会为该环境创建一个执行上下文...JavaScript中执行环境 全局环境 函数环境 eval函数环境 (已不推荐使用) 那么与之对应的执行上下文类型同样有3种: 执行上下文的类型 全局执行上下文 函数执行上下文 eval函数执行上下文...程序代码中基本都会存在函数,那么调用函数,就会进入函数执行环境,对应就会生成该函数的执行上下文。 先插播一个知识点:JS是"单线程"! "单线程"! "单线程"!...JS中管理多个执行上下文 函数编程中,代码中会声明多个函数,对应的执行上下文也会存在多个。...因为JS执行中最先进入全局环境,所以处于"栈底的永远是全局环境的执行上下文"。

4.1K41

JS学习系列 05 - 执行上下文

定义 当 JS 引擎开始执行预编译生成的代码时,就会进入到一个执行上下文(Executable Code - 简称 EC)。...在这里,我们先假设定义执行上下文栈是一个数组: EC = []; 第一种可执行代码 -- 全局代码: 全局类型代码是在加载外部的 js 文件或者本地 标签中的代码。...注意,在全局代码中,并不包含定义在全局环境 function 内的代码。...程序启动后进入初始化全局环境: EC = [ globalContext ]; 第二种可执行代码 -- 函数代码: 当定义的函数被执行时,就进入了函数代码,当前函数上下文被压入 EC 栈中。...结论 执行上下文环境是我们了解变量对象和作用域链的基础,大家一定要好好理解(其实也并不难),下一节我们来讨论变量对象,相信会让大家有一定的收获。

7610

JS面试点-执行上下文详解

当执行 JS 代码时,会产生三种执行上下文 全局执行上下文 函数执行上下文 eval 执行上下文 每个执行上下文中都有三个重要的属性 变量对象(VO),包含变量、函数声明和函数的形参,该属性只能在全局上下文中访问...作用域链(JS 采用词法作用域,也就是说变量的作用域是在定义时就决定了) this var a = 10 function foo(i) { var b = 20 } foo() 对于上述代码,执行栈中有两个上下文...:全局上下文和函数 foo 上下文。...第一个阶段是创建的阶段(具体步骤是创建 VO),JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段...function foo() { foo = 10 console.log(foo) }()) // -> ƒ foo() { foo = 10 ; console.log(foo) } 因为当 JS

87820

JS执行上下文与调用栈

简而言之,执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。每当 Javascript 代码在运行的时候,它都是在执行上下文中运行。...调用栈列表: - greeting 10.当 greeting() 函数中的所有内容都执行完之后,返回到它的调用行继续执行其余的JS代码。 11.把 greeting() 方法从调用栈列表中删除。...词法环境有两种类型: 全局环境(在全局执行上下文中)是没有外部环境引用的词法环境。全局环境的外部环境引用是 null。...: 声明式环境记录器存储变量、函数和参数。 对象环境记录器用来定义出现在全局上下文中的变量和函数的关系。 简而言之, 在全局环境中,环境记录器是对象环境记录器。...: 它同样是一个词法环境,其环境记录器持有变量声明语句在执行上下文中创建的绑定关系。

1.5K10

JS学习系列 05 - 执行上下文

定义 当 JS 引擎开始执行预编译生成的代码时,就会进入到一个执行上下文(Executable Code - 简称 EC)。...在这里,我们先假设定义执行上下文栈是一个数组: EC = []; 复制代码 第一种可执行代码 -- 全局代码: 全局类型代码是在加载外部的 js 文件或者本地 标签中的代码。...注意,在全局代码中,并不包含定义在全局环境 function 内的代码。...程序启动后进入初始化全局环境: EC = [ globalContext ]; 复制代码 第二种可执行代码 -- 函数代码: 当定义的函数被执行时,就进入了函数代码,当前函数上下文被压入 EC...结论 执行上下文环境是我们了解变量对象和作用域链的基础,大家一定要好好理解(其实也并不难),下一节我们来讨论变量对象,相信会让大家有一定的收获。

95230

JS the Hardcore: 执行上下文(Execution Context)

类似,EC 就是一段代码涉及到的场景,在代码运行之前,js engine 会做一些变量内存分配,代码上下文关联的准备工作,这就是 EC。...这就是「执行上下文栈」(Execution Context Stack),可以看作是 调用栈的镜像。...由于所有的 js 代码都存在于全局环境中,所以首先会创建 「全局执行上下文」(Global Execution Context),除此之外,js 中每一次的函数调用也会生成 EC,所以栈底肯定会是 全局执行上下文...variable, function expression, function declaration, }, } 在 EC 创建之后,js...代码执行到 ln 09 时,因为是对函数的调用,会创建一个新的执行上下文,并置为「当前执行上下文」: foo Execution Context = { this: window,

99270

稳扎稳打JS——执行上下文

上下文环境的初始化在代码执行前完成 JS有三种作用域:全局作用域、函数作用域、eval作用域(不常用,不做介绍)。...在JS代码执行前,首先会对这三种作用域进行上下文环境的准备工作,准备内容如下: 全局作用域的上下文准备工作 将全局变量设为undefined 将函数表达式的值设为undefined 为函数声明直接赋值...运行时才能确定,而全局作用域中的this在准备上下文环境的时候就确定了(window)。...因为在代码运行前的准备上下文环境过程中,函数的初始化已经完成,所以运行时无论函数调用语句在哪儿,JS编译器都能调用这个函数。 若采用函数表达式来定义函数,则函数定义一定要在函数调用语句之前!...JS中作用域只有三种:全局作用域、函数作用域、eval作用域。除此之外就没有作用域了!如:for、if、while等都不是独立的作用域! 因此在里面定义的局部变量都属于其所属的外层作用域。

1.1K70

JS执行上下文作用域闭包

一、执行上下文 单线程 同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待 全局上下文只有唯一的一个,它在浏览器关闭时出栈 函数的执行上下文的个数没有限制 每次某个函数被调用,就会有个新的执行上下文为其创建...—— return 2、函数作用域 js没有块级作用域,而有函数作用域。 函数作用域是指:在函数内声明的所有变量在函数体内是始终可见的。...  result(); // 999 f2()就是闭包 闭包的作用 ---- 四、this 全局函数里,this 等于window 函数被作为某个对象的方法调用时,this等于那个对象 匿名函数执行环境具有全局性...,this指向window (可以通过call()或apply()改变函数执行环境

1.2K30

【说站】Js如何存储执行上下文

Js如何存储执行上下文 1、执行上下文存在于数据栈中。该栈保存代码运行是创建的所有上下文。 栈的特点是后进先出,每创建一个新的上下文,就会压入栈的顶部。...当函数执行完成时,上下文从栈中弹出,控制过程到达栈中的下一个上下文。 2、当js引擎第一次触摸脚本时,它将创建一个全局的上下文,并将其压入栈中。...实例 // 创建全局上下文,入上下文执行栈 var name = 'globalName'; function F1() {   // 第一阶段进行后   // 这里this指向window   // ...// 创建F1上下文,入上下文执行栈 F1(); // F1出栈 // 全局上下文出栈 以上就是Js存储执行上下文的方法,希望对大家有所帮助。...更多js学习指路:js教程 收藏 | 0点赞 | 0打赏

95430

JS执行上下文栈和作用域链

一、JS执行上下文 执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行。...作用域有两种工作模型:词法作用域和动态作用域,JS采用的是词法作用域工作模型,词法作用域意味着作用域是由书写代码时变量和函数声明的位置决定的。...在 ES6 之前,js 中的作用域分为两种:函数作用域和全局作用域,现在作用域分为:全局作用域、函数作用域、块级作用域。   ...三、JS执行上下文栈(后面简称执行栈)   执行栈,也叫做调用栈,具有 LIFO (后进先出) 结构,用于存储在代码执行期间创建的所有执行上下文。...四、作用域链   我们知道函数在执行时是有个执行栈,在函数执行的时候会创建执行环境,也就是执行上下文,在上下文中有个大对象,保存执行环境定义的变量和函数,在使用变量的时候,就会访问这个大对象,这个对象会随着函数的调用而创建

62910

JS 到底是在干嘛:一文搞懂JS 执行上下文

所有JavaScript代码都需要在某种环境中托管和运行。在大多数情况下,这种环境是一个 web 浏览器。 对于在web浏览器中执行的任何一段JavaScript代码,很多过程都发生在后台。...然后,浏览器的JS引擎创建一个特殊的环境来处理这段JS代码的转换和执行。这个环境称为执行上下文。 执行上下文包含当前正在运行的代码,以及帮助其执行的所有内容。...每个函数执行上下文创建它的作用域:在这个环境中,它定义的变量和函数可以通过一个称为Scoping的进程访问。 这意味着代码库中某些东西的位置,也就是一段代码所在的位置。...当脚本在浏览器中加载时,全局上下文被创建为默认上下文JS引擎在其中开始执行代码,并被放置在执行堆栈的底部。 然后JS引擎在代码中搜索函数调用。...不创建“this”对象,但是可以访问定义它的环境的对象。通常是window对象。

23610
领券