重点:每个函数都有本身的执行环境,每一个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保存在这个对象中。
这个对象就是执行上下文对象:javascript
executionContextObj={ //变量对象 variableObject:{/*函数中的arguments对象,参数、内部的变量以及函数声明*/] //做用域 scopeChain:{/*variableObject以及全部父执行上下文中的variableObject*/}, this:{} }
根据这个执行环境咱们解析如下几个问题:java
一、查找变量的顺序(知识点:做用域与做用域链)
executionContextObj中的scopeChain是这个函数的做用域,scopeChain=variableObject+[[scope]]
varibaleObject为当前的变量对象,[[scope]]为父执行上下文的做用域链,variableObject位于前面,因此查找变量时老是先从自身查找,而后依次到父执行上下文中查找。
即当在函数中查找一个变量时,是根据做用域查找的。编程
二、this是什么?和做用域的区别
this老是指向函数调用时的环境(动态做用域即运行时上下文)
做用域保存的是函数被定义时的环境(静态做用域即编程时的上下文)
咱们知道javascript没有块级做用域,最小单位为函数,做用域能访问到函数中的变量,this则指向调用者,便可访问对象中的变量函数
三、提高,函数提高老是优先于变量提高(为何能够先使用后定义)
参考:[【译】JS的执行上下文和环境栈是什么?]post
在调用函数时,可是在执行里面的代码以前,会对函数进行一次扫描,解释器经过扫描传入的参数或参数的函数、本地函数声明和局部函数声明来建立executionContextObj。此扫描的结果将称为executionContextObj中的variableObject。
就是由于在代码运行以前,解释器已经扫描过在函数中变量和函数,已经建立这些变量,因此在代码执行时,这些变量就能够直接使用,而且函数的提高优先于变量。this
借鉴文章:【译】JS的执行上下文和环境栈是什么?https://juejin.im/post/5c8554...code