JS作用域和作用域链
作用域(scope):一个变量的可用范围
两种:全局作用域,任何地方都可以访问,反复使用
函数作用域,仅在函数内部可访问,不能重复使用
函数的生命周期
1、开始执行前:
创建执行环境栈(ECS数组):临时保存正在执行的函数的环境
向执行环境栈中加入第一个默认函数main()
创建全局作用域对象window
2、定义函数时:
创建函数对象,封装定义
声明函数名变量,引用函数对象
函数对象的scope属性引用回,创建函数时的作用域
3、调用函数时:
ESC中加入一个新的元素(执行环境),记录新函数调用
创建一个活动对象,保存本次函数调用用到的局部变量
ESC新执行环境元素,引用活动对象
活动对象中的parent属性引用函数的scope指向的父级作用域对象
在执行过程中:优先使用活动对象中的局部变量
局部中没有,才延parent向父级作用域找
4、调用函数后:
执行环境栈中本次函数的执行环境出栈
导致活动对象被释放 导致局部变量一同释放
作用域链:由多级作用域连续引用形成的链式结果
掌管一切变量的使用顺序: 先在局部找,没有,就延作用域向父级作用域找