我问的事情是否有一个术语,所以我会尝试说明它:
我有一个函数,它接受一系列联系人,并循环访问它们以更新他们在网站上的状态。'something.getStatus' 函数不返回任何内容,但在成功完成后,它会给出用户的状态(在线/离线/等)。
这里的问题是,当调用内部的函数时,变量 user_id 是数组中所有函数调用的最后一个,因此无法知道如何具有什么状态。
function gotGroupContacts(contacts) {
for ( i = 0; i < contacts.length; i++) {
var user_id = contacts[i];
something.getStatus(user_id, function(resp) {
updateLinkStatus(user_id, resp.status, resp.statusMessage);
}, getStatusErrorHandler);
}
}
有什么方法可以"锁定"变量,或以其他方式将其传递给其中的函数?
getStatus
方法调用括在闭包中,如下所示
for ( i = 0; i < contacts.length; i++) {
var user_id = contacts[i];
(function(uid) {
something.getStatus(uid, function(resp) {
updateLinkStatus(uid, resp.status, resp.statusMessage);
}, getStatusErrorHandler);
}(user_id))
}
user_id
被传递到匿名自执行函数中,这确保了具有正确的值
如果你的脚本不需要与IE <9兼容,你可以这样写:
function gotGroupContacts(contacts) {
contacts.forEach(function(user_id){
something.getStatus(user_id, function(resp) {
updateLinkStatus(user_id, resp.status, resp.statusMessage);
}, getStatusErrorHandler);
});
}
注意:对于每个方法都可以轻松移植到IE,请参阅以下内容:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach