实行环境、作用域链、变量提拔、this

重点:每一个函数都有本身的实行环境,每一个实行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保留在这个对象中。
这个对象就是实行高低文对象:

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…

    原文作者:Mandy
    原文地址: https://segmentfault.com/a/1190000018460144
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞