JS函数的生命周期

1,307 阅读2分钟

温故知新

js作用域:一个变量的使用范围。作用域是一个对象,所有的变量都保存在自己的作用域对象中。

函数的生命周期(4个阶段)

  1. 程序开始执行前
  • 创建执行环境栈(ECS),为依次保存正在调用的函数的执行环境的数组
  • 执行浏览器主程序,全局执行环境入栈
  • 全局执行环境EC引用window
  • 创建window为全局作用域对象
  1. 定义函数时
  • 在window中添加全局变量,变量名为函数名
  • 创建函数对象,封装函数定义
  • 函数名变量引用函数对象
  • 函数对象中有一个scope属性会指向引用函数创建时的作用域对象(就是函数来自于哪个作用域)
  1. 调用函数时
  • 在ECS中压入正在调用的函数的执行环境
  • 创建本次函数调用的函数作用域对象(活动对象AO)
  • 本次函数调用的EC引用着AO
  • 在AO中定义parent属性,引用函数scope指向的作用域对象
  • 在AO中添加局部变量的定义
  • 变量使用顺序:AO中没有,向parent指向的对象中查找,逐级向上到全局作用域window(这样就形成一个链式结构,就是作用域链的概念)如果都没有找到就抛出错误
  1. 函数调用后
  • 函数的执行环境出栈
  • 本次函数调用的函数作用域对象(AO)由于不存在引用而被释放(闭包除外,闭包的产生是由于外层作用域对象引用了AO中的变量,导致AO不会被释放,这是闭包形成的原因)
  • 对象的局部变量一同释放