qq_35436516
JHCan333
采纳率79.5%
2017-03-10 06:13

新手求教,在js的一个双层遍历中,为一个对象的属性赋值一个回调函数(带有一个必须的参数)

5
已采纳

var a = [ {
name : 'one',
a1 : 11,
a2 : 12
}, {
name : 'two',
a1 : 21,
a2 : 22
} ];
var b = [ {
name : 'one'
}, {
name : 'two'
} ];
for ( var i = 0; i < a.length; i++) {
for ( var j = 0; j < b.length; j++) {
if (a[i].name == b[j].name) {
var qqq = a[i].a1;
var www = a[i].a2;
b[j].func = function(params) {
alert(qqq + " " + www);
return qqq + " " + www;
};
}
}
}
b[0].func();
我想通过遍历,使用a中的值为b赋一个无名函数,这个无名的函数必须有一个默认参数params,而且必须放在首位才会被解析,可是现在出现了这种情况,执行出来的b中的func都是返回“21 22”就是返回的是最后的那组数据那我现在该怎么办啊?,

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • showbo GoCityPass新加坡曼谷通票 4年前

    闭包的问题,改成下面的就行了,闭包引用当前值

         var a = [{
            name: 'one',
            a1: 11,
            a2: 12
        }, {
            name: 'two',
            a1: 21,
            a2: 22
        }];
        var b = [{
            name: 'one'
        }, {
            name: 'two'
        }];
        for (var i = 0; i < a.length; i++) {
            for (var j = 0; j < b.length; j++) {
                if (a[i].name == b[j].name) {
                    var qqq = a[i].a1;
                    var www = a[i].a2;
                    b[j].func = (function (qqq, www) {////////////////////////
                        return function (params) {
                            alert(qqq + " " + www);
                            return qqq + " " + www;
                        };
                    })(qqq, www);/////////////
                }
            }
        }
        b[0].func();
        b[1].func();
    
    点赞 评论 复制链接分享
  • qq_34427235 深秋的那首歌 4年前

    闭包的问题,其实你可以用let来定义i和j,这是es6的新属性,解决作用域的问题,解决闭包带来的影响。

    点赞 评论 复制链接分享
  • H_qingxue 学无止境之问道 4年前

    你要返回的是什么?都没搞清楚你的问题,你把函数放在for中,最后遍历出来肯定时最后的啊

    点赞 评论 复制链接分享

相关推荐