JS闭包-02

闭包的应用:

    1.保存(变量)现场
    ------------------------------------------------
    var date = [];
    for(var i=0;i<5;i++){
        date[i] = function(){
            console.log("我的索引位置是: " + i);
        }
    }
    date[0]();   // 我的索引位置是: 5
    date[1]();   // 我的索引位置是: 5
    date[2]();   // 我的索引位置是: 5
    --------------------------------------
    函数执行过程 :
    --------------------------------------
    1.初始化全局环境global environment
        1.outer reference = null
        2.初始化环境记录
            date:undefined
            i:undefined
    2.执行全局代码
        date = []
        i = 0 -----> i = 5
        通过for循环创建5个匿名函数分别赋值给date数组中的元素,且其scope属性都是global environment
    3.执行到date[0](); 初始化date[0]环境
        1.outer reference = global environment
        2.初始化环境记录
            无
    4.执行date[0]();
        解析i值,即global environment中的i i已经是5
    5.下面同理
        i的值都是5
    ******************************************************************
    因为匿名函数的外部环境都是global environment,所以只可以在global environment中解析i,而
    global environment中的i只能有一个最终值,不可能解析出不同的值,
    如果想把for循环中不同的i值都保存下来需要再添加一层环境来保存i的不同的值
    ******************************************************************
    改进版:
    --------------------------------------------------
    var date = [];
    function helper(index){
        return function(){
            console.log("我的索引位置是: " + index);
        }
    }
    for(var i=0;i<5;i++){
        date[i] = helper(i);
    }
    date[0]();   // 我的索引位置是: 0
    date[1]();   // 我的索引位置是: 1
    date[2]();   // 我的索引位置是: 2
    -------------------------------------------------
    代码执行过程 :
    -------------------------------------------------
    1.初始化全局环境
        date:undefined
        i:undefined
    2.执行全局代码
    3.执行到date[0] = helper(0);时
    4.初始化helper(词法)环境
        1.outer reference = global environment
        2.初始化环境记录
            index: 0   (这一点很重要,这里i的0这个值通过index = 0被保存在helper词法环境中)
    5.执行helper(0);
        date[0] = function(){console.log("我的索引位置是:" + index)}
    ....
    ....
    ....
    x.执行到date[0]();初始化date[0]环境
        1. outer reference = helper environment
        2. 初始化环境记录
            无
    y.执行date[0]()
        解析index,即其外部环境helper environment中的index = 0
    ****************************************************
    for循环中的每一次循环都会创建不同的helper环境,其中保存着不同的index值(可以理解为i的副本)
    实际上,date[i]获得的匿名函数是一个闭包,其中引用着其外部环境helper环境中的index
    ****************************************************
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值