资讯专栏INFORMATION COLUMN

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

vpants / 847人阅读

摘要:重点每一个函数都有自己的执行环境,每个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保存在这个对象中。即当在函数中查找一个变量时,是根据作用域查找的。此扫描的结果将称为中的。借鉴文章译的执行上下文和环境栈是什么

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

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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109117.html

相关文章

  • 形象化模拟作用域链,深入理解js作用域、闭包

    摘要:至此作用域链创建完毕。好了,通过深入理解作用域链,我们能跟好的理解的运行机制和闭包的原理。 前言 理解javascript中的作用域和作用域链对我们理解js这们语言。这次想深入的聊下关于js执行的内部机制,主要讨论下,作用域,作用域链,闭包的概念。为了更好的理解这些东西,我模拟了当一个函数执行时,js引擎做了哪些事情--那些我们看不见的动作。 关键词: 执行环境 作用域 作用域链 变...

    txgcwm 评论0 收藏0
  • JS核心知识点梳理——上下文、作用域、闭包、this(上)

    摘要:引言满满的干货,面试必系列,参考大量资料,并集合自己的理解以及相关的面试题,对核心知识点中的作用域闭包上下文进行了梳理。如果在小区这个作用域找到了张老师,我就会在张老师的辅导下学钢琴我张老师房间钢琴构成了学琴的上下文环境。 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 满满的干货,面试必bei系列,参考大...

    Andrman 评论0 收藏0
  • JavaScript基础系列---执行环境作用域链

    摘要:延长作用域链下面两种语句可以在作用域链的前端临时增加一个变量对象以延长作用域链, 问题 今天看笔记发现自己之前记了一个关于同名标识符优先级的内容,具体是下面这样的: 形参优先级高于当前函数名,低于内部函数名 形参优先级高于arguments 形参优先级高于只声明却未赋值的局部变量,但是低于声明且赋值的局部变量 函数和变量都会声明提升,函数名和变量名同名时,函数名的优先级要高。执行代...

    J4ck_Chan 评论0 收藏0
  • JS:执行环境作用域链变量提升this

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

    scwang90 评论0 收藏0
  • “动静结合” 小白初探静态(词法)作用域,作用域链执行环境(EC)

    摘要:图片中的作用域链,是全局执行环境中的作用域链。然后此活动对象被推入作用域链的最前端。在最后调用的时候,创建先构建作用域链,再创建执行环境,再创建执行环境的时候发现了一个变量标识符。 从图书馆翻过各种JS的书之后,对作用域/执行环境/闭包这些概念有了一个比较清晰的认识。 栗子说明一切 第一个栗子 来看一个来自ECMA-262的栗子: var x = 10; (function foo(...

    Drummor 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<