共计 917 个字符,预计需要花费 3 分钟才能阅读完成。
重点:每一个函数都有自己的执行环境,每个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保存在这个对象中。这个对象就是执行上下文对象:
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…