如何为回调函数赋予变量在特定时刻具有的值

时间:2014-05-11 20:35:09

标签: javascript

我有问题,有一个回调函数,我想传递另一个变量。但是当执行回调函数时,变量已经改变。我该如何解决这个问题?

for (var i = 0; i < data.items.length; i++) {
    var item = data.items[i];


    p.api.get('items.info', {
        itemId: item.id
    }, function (response, item.id) {
        alert(item.id);
        alert(response["tags"][0]["tag"]);
    });
}

这就是我正在谈论的功能。如果有人能帮助我,我真的很开心。

2 个答案:

答案 0 :(得分:0)

您的匿名函数使用循环中更改的上下文。这是一个常见的问题,有几个修复问题&#39;:

1 .bind()

p.api.get('items.info', {
    itemId: item.id
}, (function (response) {
    // item now comes from `this.item`, not `item`
}).bind({item: item}));

2 IIFE(或者他们现在所称的任何内容):

p.api.get('items.info', {
    itemId: item.id
}, (function(item) {
    return function (response) {
        // item is now in `item` because a new context was created
    };
})(item));

两者都有点不可读和不直观。必须有更好的方法,但它们取决于您的应用程序结构。 (也许你可以将上下文传递给.get()`?)

答案 1 :(得分:0)

你可以简单地把我放在一个闭包中:

for (var i = 0; i < data.items.length; i++) {
   (function(i) {
    var item = data.items[i];
    p.api.get('items.info', {
        itemId: item.id
    }, function (response, item.id) {
        alert(item.id);
        alert(response["tags"][0]["tag"]);
    });
   })(i);
}