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的指向 == > 指向调用它的对象

相关