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