zoukankan      html  css  js  c++  java
  • 如何解决闭包只能取得包含函数中任何变量的最后一个值

    下面的例子中,每个函数都返回的是10。因为每个函数的作用域链中都保存着createFunction()函数的活动对象,所以他们引用的都是同一个变量

    function createFunction(){
        var result = new Array();
        for (var i=0 ; i <10 ; i++ )
        {
            result[i] =function(){
                    return i;
                }
        }
        return result;
    }
    
    var funcs = createFunction();
    
    for (var i=0;i<10 ;i++ )
    {
        alert(funcs[i]());
    }
    
    function createFunction(){
        var result = new Array();
        for (var i=0 ; i <10 ; i++ )
        {
            result[i] = function(){}
        }
        return result;
    }
    
    var funcs = createFunction();
    
    for (var i=0;i<10 ;i++ )
    {
        alert(funcs[i]())
    }

    通过创建另一个匿名函数可以使得闭包的行为符合预期,定义了一个匿名函数,并将立即执行该匿名函数的结果赋给数组。这里的匿名函数有一个参数num,也就是最终函数要返回的值。在调用每个匿名函数的时候,都传入了变量i。由于函数的参数是按值传递的,所以会将变量i的当前值复制给num。而在这个匿名函数内部,又创建了一个访问num的闭包。这样一来,result数组中的每个函数都有自己num变量的一个副本,因此就可以返回不同的值啦。

    function createFunction(){
        var result = new Array();
        for (var i=0 ; i <10 ; i++ )
        {
            result[i] = function(num){
                return function(){
                    return num;
                }
            }(i);
        }
        return result;
    }
    
    var funcs = createFunction();
    
    for (var i=0;i<10 ;i++ )
    {
        alert(funcs[i]())
    }
  • 相关阅读:
    职业生涯起步不要去顶级公司
    discuz uc密码修改
    习惯决定成功与否
    世上没有理想的工作
    中山市慧海人力资源服务有限公司
    Codeforces Round #365 (Div. 2) B 前缀和
    Codeforces Round #365 (Div. 2) A 水
    tyvj 1067 dp 两次LIS(nlogn)
    Codeforces Round #303 (Div. 2) D 贪心
    Codeforces Round #303 (Div. 2) C dp 贪心
  • 原文地址:https://www.cnblogs.com/yingzi/p/2584766.html
Copyright © 2011-2022 走看看