执行环境、作用域链、变量提升、this

死锁专家
• 阅读 874

重点:每一个函数都有自己的执行环境,每个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保存在这个对象中。
这个对象就是执行上下文对象:

executionContextObj={
    //变量对象
    variableObject:{/*函数中的arguments对象,参数、内部的变量以及函数声明*/]
    //作用域
    scopeChain:{/*variableObject以及所有父执行上下文中的variableObject*/},
    this:{}
}

根据这个执行环境我们解析以下几个问题:

1、查找变量的顺序(知识点:作用域与作用域链)
executionContextObj中的scopeChain是这个函数的作用域,scopeChain=variableObject+[[scope]]
varibaleObject为当前的变量对象,[[scope]]为父执行上下文的作用域链,variableObject位于前面,所以查找变量时总是先从自身查找,然后依次到父执行上下文中查找。
即当在函数中查找一个变量时,是根据作用域查找的。

2、this是什么?和作用域的区别
this总是指向函数调用时的环境(动态作用域即运行时上下文)
作用域保存的是函数被定义时的环境(静态作用域即编程时的上下文)
我们知道javascript没有块级作用域,最小单位为函数,作用域能访问到函数中的变量,this则指向调用者,即可访问对象中的变量

3、提升,函数提升总是优先于变量提升(为什么可以先使用后定义)
参考:[【译】JS的执行上下文和环境栈是什么?]

在调用函数时,但是在执行里面的代码之前,会对函数进行一次扫描,解释器通过扫描传入的参数或参数的函数、本地函数声明和局部函数声明来创建executionContextObj。此扫描的结果将称为executionContextObj中的variableObject。

就是因为在代码运行之前,解释器已经扫描过在函数中变量和函数,已经创建这些变量,所以在代码执行时,这些变量就可以直接使用,并且函数的提升优先于变量。

借鉴文章:【译】JS的执行上下文和环境栈是什么?https://juejin.im/post/5c8554...

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
4年前
JavaScript - 关于 var、let、const 的区别使用
一、var在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量注意:顶层对象,在浏览器环境指的是window对象,在Node指的是global对象var a  10;console.log(window.a) // 10使用var声明的变量存在变量提升的情况console.log(a) // undefine
Souleigh ✨ Souleigh ✨
4年前
JS - 作用域
一、作用域作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合换句话说,作用域决定了代码区块中变量和其他资源的可见性举个例子function myFunction(){    let inVariable  "函数内部变量";}myFunction();//要先执行这个函数,否则根本不知
Karen110 Karen110
3年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
Wesley13 Wesley13
3年前
java成员变量的初始化
类变量(static变量,不需要实例化对象也可以引用)实例变量(非static变量,需要实例化对象)局部变量(类的成员函数中的变量)初始化方式:构造函数初始化变量声明时初始化代码块初始化java自动初始化(在构造函数执行之前执行) java保证所有变量被使用之前都是经过初始化的(声明并且定义过,被赋值
菜园前端 菜园前端
2年前
为你解惑JS作用域和作用域链知识
原文链接:变量作用域一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是可以访问的。然而在函数内声明的变量只能在函数体内访问,它们是局部变量,作用域是局部性的。函数参数也是局部变
御弟哥哥 御弟哥哥
4年前
彻底理解js的作用域链
在之前的文章(https://www.helloworld.net/p/G4dFV7tALU4J)中我已经介绍了执行上下文的变量对象。在这一篇文章我要介绍执行上下文的作用域链了。执行上下文.作用域链(scopechain)作用域链与变量对象有着密不可分的关系,因为作用域链就是变量对象的数组!其中第
御弟哥哥 御弟哥哥
4年前
彻底理解js的执行上下文,以及变量对象
在js中,执行上下文(ExecutionContext)是非常重要的一种对象,它保存着函数执行所需的重要信息,其中有三个属性:变量对象(variableobject),作用域链(scopechain),this指针(thisvalue),它们影响着变量的解析,变量作用域和函数this的指向。上下文栈(ExecutionContextS
Wesley13 Wesley13
3年前
Java 中的堆和栈
Java中的堆和栈简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存。      在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。      当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的
Stella981 Stella981
3年前
JS 中的this指向问题和call、apply、bind的区别
this的指向问题一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window。functiona(){console.log(this);//输出函数a中的this对象}functionb(){};varc{name:"call"}
Stella981 Stella981
3年前
Flask的RuntimeError错误处理
在Flask框架中,为我们提供了丰富的上下文对象/变量(request、session、current\_app、g),这些上下文对象可以根据不同的上下文环境具备不同的值,所以他们是依赖于上下文环境的,而他们的使用也必须在上下文环境中,如果脱离了上下文环境,对这些没有上下文环境的上下文对象/变量进行相应的操作就会报错:RuntimeError  通俗一点
Stella981 Stella981
3年前
JavaScript之深入理解this
定义this是函数运行时自动生成的内部对象,即调用函数的那个对象。(不一定很准确的定义,但还算通俗易懂)在大多数情况下,this的值由函数调用方式决定,它不能在执行期间赋值来设置,它在每次执行下可能都有不同的值。全局执行环境(outsidefunction)在全局执行环境中,this一直