js高级-函数的作用域/执行上下文
1.变量提升的引入
那么到底是什么机制产生了变量提升,为什么需要变量提升hoist呢?
2.执行上下文
(1)全局执行上下文
- 在执行全局代码前,将window确定为全局执行上下文==>window也就是全局执行上下文你对象
- 对全局数据进行预处理
- var 定义的全局变量 == > undefined,添加到window对象上作为其属性
- function声明的全局函数 == > 直接赋值,添加为window的方法
- this == > 直接赋值为window ,可以通过它调用window上的属性和方法
- 执行全局代码
(2)局部执行上下文(函数执行上下文)
- 在调用函数时,准备执行函数体之前==>创建一个对应的函数执行上下文对象
- 对局部参数进行预处理
- 形参变量 ==> 赋值(接收的实参) == >添加为执行上下文的属性
- arguments ==> 赋值(接收的实参列表) == >添加为执行上下文属性
- 在函数内部var定义的局部变量 == > undefined ==> 变量提升 ==>添加为执行上下文属性
- 在函数内部声明的函数 ==> 赋值(fun),添加为执行上下文方法
- this ==> 赋值(调用函数的对象)
- 开始执行函数体代码
3.上下文栈
用于存储所有的执行上下文对象(单不是一个真正的对象,只是相关属性被放到栈内的一个部分)
执行完后就销毁该执行上下文对象,最后只剩下全局上下文环境在栈底
后进先出
递归则是不断的在执行上下文栈中创建新的函数执行活动对象,从f(1)到最先最后进入的fn(n)执行完毕时,开始依次后进先出的销毁这些对象并执行上一层的后续代码
把递归用执行上下栈的观点去看待
4.变量提升和函数提升的先后顺序
先执行变量提升,输出是function
4.注意作用域链中this的指向 == > 指向调用它的对象