什么是:一个变量的可用范围——用途
一个存储变量的对象——存储/本质
为什么:避免不同范围的变量间互相干扰
包括2种:
1.全局作用域:不属于任何函数的,外部的范围
全局变量:反复使用,随处可用
其实window就是全局作用域对象
2. 函数作用域:函数内的范围
局部变量:仅函数内使用,不可反复使用!
局部变量包括两种:参数变量;函数内var出来的变量;
其实就是活动对象AO
函数的声明周期
开始执行程序前:
创建执行环境栈(ECS):保存正在调用的函数记录
首先自动调用浏览器主程序main()
主程序创建全局作用域对象window
定义函数时:
在window中用函数名创建全局变量
在window外创建函数对象,保存函数定义
函数名变量引用函数对象
函数对象的scope属性指回函数来自的作用域对象
调用函数时:
在ECS中压入当前函数的调用记录
为本次函数调用创建活动对象AO
AO中保存局部变量
AO指向函数scope属性指向的相同对象window
变量的使用顺序:优先用AO中的局部变量,AO中没有才去window中找
函数调用后:
函数的调用记录从ECS中出栈
导致:AO释放->导致:AO中的局部变量一同释放
所以,局部变量仅在调用函数时可用,不可重用
作用域链(scope chain)
什么是:由多级作用域,连续引用形成的链式结构
存储了所有的变量,控制了变量的使用顺序(先局部后全局)