重点:每一个函数都有自己的执行环境,每个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保存在这个对象中。
这个对象就是执行上下文对象:
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...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。