javascript闭包:返回值的歧义

时间:2015-12-06 13:44:38

标签: javascript closures

function celebrityIDCreator(theCelebrities) {
    var i;
    var uniqueID = 100;
    for (i = 0; i < theCelebrities.length; i++) {
        theCelebrities[i]["id"] = function () {
            return uniqueID + i;
        };
    };

    return theCelebrities;
}

var actionCelebs = [
    { name: "Stallone", id: 0 },
    { name: "Cruise", id: 0 },
    { name: "Willis", id: 0 }
];
var createIdForActionCelebs = celebrityIDCreator(actionCelebs);
var stalloneID = createIdForActionCelebs[0];
console.log(stalloneID.id()); // 103

在前面的示例中,在调用匿名函数时,i的值为3(数组的长度然后递增)。数字3被添加到uniqueID以为所有名人ID创建103。因此返回数组中的每个位置都得到id = 103,而不是预期的100,101,102。

我阅读了回调函数文章,当我无法理解这句话时,我的意思是如何解释我们总是得到id = 103?
我在网上搜索但找不到一个好的答案。希望在这里我能克服它。感谢。

2 个答案:

答案 0 :(得分:1)

原因是您正在使用回调函数。一旦调用就应该执行回调。因此,一旦你实际调用它就会执行它。

在您的情况下,每次迭代的回调返回始终是$scope.tag = result[0].name; + i的最后一个值。

答案 1 :(得分:1)

这是因为关闭。阅读herehere

这可以解决您的问题:

function celebrityIDCreator(theCelebrities) {
    var i;
    var uniqueID = 100;
    for (i = 0; i < theCelebrities.length; i++) {
        theCelebrities[i]["id"] = (function (index) {
            return function () {
                return uniqueID + index;
            };
        })(i);
    }

    return theCelebrities;
};