JavaScript中执行环境 全局环境 函数环境 eval函数环境 (已不推荐使用) 那么与之对应的执行上下文类型同样有3种: 执行上下文的类型 全局执行上下文 函数执行上下文 eval函数执行上下文...程序代码中基本都会存在函数,那么调用函数,就会进入函数执行环境,对应就会生成该函数的执行上下文。 先插播一个知识点:JS是"单线程"! "单线程"! "单线程"!...JS中管理多个执行上下文 函数编程中,代码中会声明多个函数,对应的执行上下文也会存在多个。...程序执行进入一个执行环境时,它的执行上下文就会被创建,并被推入执行栈中(入栈);程序执行完成时,它的执行上下文就会被销毁,并从栈顶被推出(出栈),控制权交由下一个执行上下文。...因为JS执行中最先进入全局环境,所以处于"栈底的永远是全局环境的执行上下文"。
执行上下文和执行栈是js执行机制中的两个概念,要想深入的对js进行理解与应用,理解js的机制很重要,下面来说一下什么是执行上下文,什么又是执行栈。...执行上下文 简而言之,执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行。...一个程序中只能存在一个全局执行上下文。 函数执行上下文是指在每次调用函数时,都会为该函数创建一个新的执行上下文,这就是函数执行上下文,他可以有无数个。有多少个函数就有多少个函数执行上下文。...每个函数都拥有自己的执行上下文,但是只有在函数被调用的时候才会被创建。一个程序中可以存在任意数量的函数执行上下文。每当一个新的执行上下文被创建,它都会按照特定的顺序执行一系列步骤。...Eval 函数执行上下文:是指运行在 eval 函数中的代码创建的自己的执行上下文。
js执行上下文的类型 1、全局上下文:是基础,默认上下文类型,任何不在函数内的代码都在全局上下文中。...它会执行两件事:创建一个全局window对象,设置this的值等于这个对象,一个程序只有一个全局上下文环境。 2、函数上下文:每当调用一个函数,就会为这个函数创建一个新的上下文。...每个函数都有自己的上下文,函数上下文可以任意多个。 3、eval函数执行上下文:执行在eval函数内部的函数也有自己的函数上下文。...执行上下文的类型,希望对大家有所帮助。...更多js学习指路:js教程 收藏 | 0点赞 | 0打赏
定义 当 JS 引擎开始执行预编译生成的代码时,就会进入到一个执行上下文(Executable Code - 简称 EC)。...可执行代码有几种 前面说到当引擎执行到可执行代码的时候,就会将当前上下文压入上下文栈中。那么可执行的代码又分为几种?...在这里,我们先假设定义执行上下文栈是一个数组: EC = []; 第一种可执行代码 -- 全局代码: 全局类型代码是在加载外部的 js 文件或者本地 标签中的代码。...程序启动后进入初始化全局环境: EC = [ globalContext ]; 第二种可执行代码 -- 函数代码: 当定义的函数被执行时,就进入了函数代码,当前函数上下文被压入 EC 栈中。...当所有代码执行完以后,EC 中只会包含全局上下文(global context),当程序退出以后,全局上下文也会退出。
当执行 JS 代码时,会产生三种执行上下文 全局执行上下文 函数执行上下文 eval 执行上下文 每个执行上下文中都有三个重要的属性 变量对象(VO),包含变量、函数声明和函数的形参,该属性只能在全局上下文中访问...作用域链(JS 采用词法作用域,也就是说变量的作用域是在定义时就决定了) this var a = 10 function foo(i) { var b = 20 } foo() 对于上述代码,执行栈中有两个上下文...通常提升的解释是说将声明的代码移动到了顶部,这其实没有什么错误,便于大家理解。但是更准确的解释应该是:在生成执行上下文时,会有两个阶段。...第一个阶段是创建的阶段(具体步骤是创建 VO),JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段...() { foo = 10 ; console.log(foo) } 因为当 JS 解释器在遇到非匿名的立即执行函数时,会创建一个辅助的特定对象,然后将函数名称作为这个对象的属性,因此函数内部才可以访问到
执行上下文的类型 JavaScript 中有三种执行上下文类型。 全局执行上下文 — 这是默认或者说基础的上下文,任何不在函数内部的代码都在全局上下文中。...它会执行两件事:创建一个全局的 window 对象(浏览器的情况下),并且设置 this 的值等于这个全局对象。一个程序中只会有一个全局执行上下文。...调用栈列表: - greeting 10.当 greeting() 函数中的所有内容都执行完之后,返回到它的调用行继续执行其余的JS代码。 11.把 greeting() 方法从调用栈列表中删除。...调用栈列表: 空 我们从一个空的调用栈开始,当我们调用一个函数时,它会自动添加到调用栈中,在执行完所有代码之后,它会自动从调用栈中删除。最后,我们也得到了一个空栈。 怎么创建执行上下文?...(在浏览器中, this引用 Window 对象)。 在函数执行上下文中, this 的值取决于该函数是如何被调用的。
定义 当 JS 引擎开始执行预编译生成的代码时,就会进入到一个执行上下文(Executable Code - 简称 EC)。...栈底部永远是全局上下文(global context),而顶部就是当前活动的执行上下文。执行到当前代码时,上下文入栈,执行完毕后,上下文出栈。 2....可执行代码有几种 前面说到当引擎执行到可执行代码的时候,就会将当前上下文压入上下文栈中。那么可执行的代码又分为几种?...在这里,我们先假设定义执行上下文栈是一个数组: EC = []; 复制代码 第一种可执行代码 -- 全局代码: 全局类型代码是在加载外部的 js 文件或者本地 标签中的代码。...当所有代码执行完以后,EC 中只会包含全局上下文(global context),当程序退出以后,全局上下文也会退出。
类似,EC 就是一段代码涉及到的场景,在代码运行之前,js engine 会做一些变量内存分配,代码上下文关联的准备工作,这就是 EC。...EC 中会给变量分配一个存储空间,与之对应的数据结构称作 enviroment。 当程序流程需要从当前的 EC 进入另外一个和当前上下文无关的代码片段时,会创建一个新的 EC,并被推入栈中。...这就是「执行上下文栈」(Execution Context Stack),可以看作是 调用栈的镜像。...由于所有的 js 代码都存在于全局环境中,所以首先会创建 「全局执行上下文」(Global Execution Context),除此之外,js 中每一次的函数调用也会生成 EC,所以栈底肯定会是 全局执行上下文...代码执行到 ln 09 时,因为是对函数的调用,会创建一个新的执行上下文,并置为「当前执行上下文」: foo Execution Context = { this: window,
代码都是在执行上下文中运行的。你可以将代码运行与执行上下文的关系类比为进程与内存的关系,在代码运行过程中的变量环境信息都放在执行上下文中,当代码运行结束,执行上下文也会销毁。...在执行上下文中记录了代码执行过程中的状态信息,根据不同运行场景,执行上下文会细分为如下几种类型:全局执行上下文:当运行代码是处于全局作用域内,则会生成全局执行上下文,这也是程序最基础的执行上下文。...而执行栈(Execution Context Stack)是用来管理执行期间创建的所有执行上下文的数据结构,它是一个LIFO(后进先出)的栈,它也是我们熟知的JS程序运行过程中的调用栈。...将全局执行上下文压入执行栈,通常JS引擎都有一个指针running指向栈顶元素:图片JS引擎会将全局范围内声明的函数(foo)初始化在全局上下文中,之后开始一行行的执行代码,运行到console就在running...总结本文关于执行上下文的理论知识比较多,不容易马上吸收理解,建议你逐渐消化、反复阅读理解。当你熟悉了执行上下文和词法环境,相信去理解认识更多JS特性和概念时,会更加轻松容易。
执行上下文的类型 执行上下文总共有三种类型 全局执行上下文:只有一个,浏览器中的全局对象就是 window 对象,this 指向这个全局对象。...函数执行上下文:存在无数个,只有在函数被调用的时候才会被创建,每次调用函数都会创建一个新的执行上下文。 Eval 函数执行上下文: 指的是运行在 eval 函数中的代码,不用很少用而且不建议使用。...执行栈 执行栈,也叫调用栈,具有 LIFO(后进先出)结构,用于存储在代码执行期间创建的所有执行上下文。 首次运行JS代码时,会创建一个全局执行上下文并Push到当前的执行栈中。...根据执行栈LIFO规则,当栈顶函数运行完成后,其对应的函数执行上下文将会从执行栈中Pop出,上下文控制权将移到当前执行栈的下一个执行上下文。...执行上下文的创建 执行上下文分两个阶段创建:1)创建阶段; 2)执行阶段 创建阶段 1、确定 this 的值,也被称为 This Binding。
执行上下文总共有三种类型 全局执行上下文:只有一个,浏览器中的全局对象就是 window 对象,this 指向这个全局对象。...函数执行上下文:存在无数个,只有在函数被调用的时候才会被创建,每次调用函数都会创建一个新的执行上下文。...Eval 函数执行上下文: 指的是运行在 eval 函数中的代码,不用很少用而且不建议使用。...执行栈 执行栈,也叫调用栈,具有 LIFO(后进先出)结构,用于存储在代码执行期间创建的所有执行上下文。 首次运行JS代码时,会创建一个全局执行上下文并Push到当前的执行栈中。...根据执行栈LIFO规则,当栈顶函数运行完成后,其对应的函数执行上下文将会从执行栈中Pop出,上下文控制权将移到当前执行栈的下一个执行上下文。 ?
一、执行上下文 单线程 同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待 全局上下文只有唯一的一个,它在浏览器关闭时出栈 函数的执行上下文的个数没有限制 每次某个函数被调用,就会有个新的执行上下文为其创建...,即使是调用的自身函数,也是如此。...—— return 2、函数作用域 js没有块级作用域,而有函数作用域。 函数作用域是指:在函数内声明的所有变量在函数体内是始终可见的。...---- 四、this 全局函数里,this 等于window 函数被作为某个对象的方法调用时,this等于那个对象 匿名函数执行环境具有全局性,this指向window (可以通过call()或apply...()改变函数执行环境)
上下文环境的初始化在代码执行前完成 JS有三种作用域:全局作用域、函数作用域、eval作用域(不常用,不做介绍)。...在JS代码执行前,首先会对这三种作用域进行上下文环境的准备工作,准备内容如下: 全局作用域的上下文准备工作 将全局变量设为undefined 将函数表达式的值设为undefined 为函数声明直接赋值...JS运行时才能确定,而全局作用域中的this在准备上下文环境的时候就确定了(window)。...因为在代码运行前的准备上下文环境过程中,函数的初始化已经完成,所以运行时无论函数调用语句在哪儿,JS编译器都能调用这个函数。 若采用函数表达式来定义函数,则函数定义一定要在函数调用语句之前!...JS中作用域只有三种:全局作用域、函数作用域、eval作用域。除此之外就没有作用域了!如:for、if、while等都不是独立的作用域! 因此在里面定义的局部变量都属于其所属的外层作用域。
js如何创建执行上下文 1、创建一个执行分为两个阶段:创建阶段和执行阶段。 2、创建阶段会发生三件事:绑定this指向,也被称为 This Binding、创建词法环境组件、创建变量环境组件。...this 指向 LexicalEnvironment = { ... }, // 词法环境 VariableEnvironment = { ... }, // 变量环境 } 以上就是js...创建执行上下文的方法,希望对大家有所帮助。...更多js学习指路:js教程 收藏 | 0点赞 | 0打赏
Js如何存储执行上下文 1、执行上下文存在于数据栈中。该栈保存代码运行是创建的所有上下文。 栈的特点是后进先出,每创建一个新的上下文,就会压入栈的顶部。...当函数执行完成时,上下文从栈中弹出,控制过程到达栈中的下一个上下文。 2、当js引擎第一次触摸脚本时,它将创建一个全局的上下文,并将其压入栈中。...,入上下文执行栈 同理 F2(name); //F2 出栈 console.log(sex); //sex未创建,未赋值,且作用域链中也没有,所以报错 sex not defined }...// 创建F1上下文,入上下文执行栈 F1(); // F1出栈 // 全局上下文出栈 以上就是Js存储执行上下文的方法,希望对大家有所帮助。...更多js学习指路:js教程 收藏 | 0点赞 | 0打赏
first-article 在这篇文章中,我将深入探讨JavaScript的最基本部分之一,即Execution Context(执行上下文)。...Execution Context Stack(执行上下文堆栈) 浏览器中的JavaScript解释器被实现为单个线程。...如果在全局代码中调用函数,程序的顺序流进入被调用的函数,创建新的执行上下文并将其推送到执行堆栈的顶部。 如果在当前函数中调用另一个函数,则会发生同样的事情。...浏览器将始终执行位于堆栈顶部的当前执行上下文,并且一旦函数执行完当前执行上下文后,它将从栈顶部弹出,把控制权返回到当前栈中的下一个上下文。 下面的示例显示了递归函数和程序的执行堆栈: ? ?...此扫描的结果将成为executionContextObj中的variableObject。 以下是解释器如何预处理代码的伪代码概述: 找一些代码来调用一个函数。 在执行功能代码之前,创建执行上下文。
一、JS执行上下文 执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行。...执行上下文类型分为:全局执行上下文和函数执行上下文。执行上下文创建过程中,需要做以下几件事: (1)创建变量对象:首先初始化函数的参数arguments,提升函数声明和变量声明。...( with 和 eval 能够修改词法作用域,但是不推荐使用,对此不做特别说明) 在 js 中是词法作用域,意思就是你的变量函数的作用域是由你的编码中的位置决定的,当然可以通过 apply、call...三、JS执行上下文栈(后面简称执行栈) 执行栈,也叫做调用栈,具有 LIFO (后进先出) 结构,用于存储在代码执行期间创建的所有执行上下文。...当栈顶的函数运行完成后,其对应的函数执行上下文将会从执行栈中Pop出,上下文的控制权将移动到当前执行栈的下一个执行上下文。
这篇文章中,我将深入探讨JavaScript中的一个最基本的部分,即执行上下文(或称环境)。...如果在全局代码中调用一个函数,程序的顺序流就进入被调用的函数,创建一个新的执行上下文并将该上下文推送到执行栈的顶部。 如果你在当前函数中调用另外一个函数,则会发生同样的事情。...但是,在JavaScript的解释器中,执行上下文的调用都有两个阶段: 创建阶段【调用函数时,但是在执行里面的代码之前】: 创建作用域链 创建变量,函数和参数 确定this的值 激活/代码执行阶段: 分配值...此扫描的结果将称为executionContextObj中的variableObject。 以下是解释器如何评估代码的伪概述: 找些代码来调用一个函数 在执行函数代码之前,创建执行上下文。...如果变量名称已存在于变量对象(或活动对象)中,则不执行任何操作并继续扫描(即跳过)。 确定上下文中的this。 激活/代码执行阶段: 在上下文中运行/解释功能代码,并在代码逐行执行时分配变量值。
然后,浏览器的JS引擎创建一个特殊的环境来处理这段JS代码的转换和执行。这个环境称为执行上下文。 执行上下文包含当前正在运行的代码,以及帮助其执行的所有内容。...JavaScript引擎在定义函数的执行上下文中遍历作用域,以解析其中调用的变量和函数,这种做法称为作用域链。 只有当JS引擎无法解析范围链中的变量时,它才会停止执行并抛出错误。...当脚本在浏览器中加载时,全局上下文被创建为默认上下文,JS引擎在其中开始执行代码,并被放置在执行堆栈的底部。 然后JS引擎在代码中搜索函数调用。...对于每个函数调用,都会为该函数创建一个新的FEC,并置于当前正在执行的执行上下文之上。 位于执行堆栈顶部的执行上下文成为活动的执行上下文,并且总是首先由JS引擎执行。...一旦活动的执行上下文中的所有代码执行完毕,JS引擎就会弹出执行堆栈中的特定函数的执行上下文,移动到它下面的下一个函数,以此类推。
JavaScript 有一套完全不同于其它语言的对 this 的处理机制。 在五种不同的情况下 ,this 指向的各不相同。...有句话说得很在理 -- 谁调用它,this就指向谁 一、全局范围内 在全局范围内使用this ,它将指向全局对象(浏览器中为 window) var name = 'name1'; console.log...还有几个常见的情况,根据谁调用方法就指向谁的原则,this的指向要细看 // 全局 name var name = 'name1'; var obj = { name: 'name2',...console.log(name); // 输出更改之后,obj对象中 name的值 console.log(obj.name); },0); ?...若直接调用这个函数,this就默认执行全局对象了。
领取专属 10元无门槛券
手把手带您无忧上云