作用域(scope): 2种
1. 全局作用域:
全局变量: 随处可用,可反复使用
2. 函数作用域:
局部变量: 只有函数调用时,函数内部可用
调用结束后,释放
包含: 参数和在函数内声明的变量
***函数的执行原理:
0. 程序加载时:
创建执行环境栈:保存函数调用顺序的数组
首先压入全局执行环境(EC)
全局EC引用全局对象window
window中将要保存全局变量
1. 定义时:
创建函数对象,封装函数的定义。
在函数对象中定义scope属性,记录函数来自的作用域
全局函数的scope都是window
2. 调用前:
在执行环境栈中压入新的EC
创建活动对象AO: 保存本次函数调用用到的局部变量
在EC中添加scope chain属性引用AO
设置AO的parent为函数的scope引用的对象
3. 调用时:
变量的使用规则: 优先使用局部变量
如果局部没有才去全局找
4. 调用完:
函数的EC出栈,AO自动释放,局部变量也就自动释放
作用域链(scope chain):
以EC中scope chain属性为起点,经过AO逐级引用,形成的链式结构
作用: 查找变量。
***闭包:保护一个可反复使用的局部变量的一种词法结构
为什么: 全局变量: 优: 可重复使用
缺: 随处可用,容易被污染
局部变量: 优: 仅内部可用,不会被污染
缺: 一次性
如何实现: 3步:
1. 确定受保护的变量?
2. 定义专门使用变量的函数
3. 用外层函数,将受保护的变量和操作变量的函数包裹起来
外层函数返回内层函数
如何获得内部函数:
调用外部函数,使用变量接住返回的内部函数