作用域链和闭包
一.作用域链:Scope Chain
1. 作用域:
函数作用域[[scope]]:外部对内部可见;内部对外部不可见;内部优先
JS中只有函数级别的作用域,没有块级别的作用域;换句话说,只有在进入或者退出函数的时候,作用域会发生变化
2. 执行环境(EC)和作用域链
执行环境,定义了执行期间可以访问的变量和函数。
全局执行环境:
Global Object(window)
从见到JS代码开始创建
到网页关闭时销毁
函数执行环境
Activation Object
从函数调用开始创建
到函数调用结束时销毁
作用域[[scope]],每个函数都有
作用域是私有属性,只能由JS引擎访问
作用域链,是AO和GO构成的链
所谓执行环境,就是根据作用域链依次查找变量和函数:找到即停;全部找完无果,报错
作用域链每个函数都有
3. 生成作用域链:
每个函数在定义(函数声明\函数表达式)时会拷贝其父亲函数的作用域链
在函数被调用时,生成AO然后将AO压入作用域链的栈顶
4. 作用域链的应用:
效率:尽量少使用靠近上层的变量,多使用自己的局部变量
重名,容易出错:尽量减少不同层次函数使用相同的变量名;避免函数名与变量名一样
函数退出以后AO是否一定被释放?不一定
二. 闭包:函数的AO通过scope chain 相互连接起来,使得函数体内的变量都可以保存在函数的AO,这样的特性称为“闭包”。
1.闭包的危险:
会造成原有AO不释放,产生内存泄漏
2.闭包的应用:
实现公有变量
缓存存储结构
封装,实现属性私有化
模块化开发