JS闭包-02

来源:互联网 发布:东欧社会主义国家 知乎 编辑:程序博客网 时间:2024/06/06 00:47

闭包的应用:

    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
原创粉丝点击