面向对象--闭包

时间:2022-01-08 22:39:01
 闭包: 
   作用域(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. 用外层函数,将受保护的变量和操作变量的函数包裹起来
      外层函数返回内层函数


   如何获得内部函数:
   调用外部函数,使用变量接住返回的内部函数