我在 for 循环中多次调用一个 API 函数 - 它需要一个回调。我的回调需要做一些特定于索引的事情。我无法更改 willCallBack 函数(它是 API 的一部分),并且我想避免创建全局变量。
下面的代码片段说明了这个问题。第一个 for 循环是我的第一次尝试,但它为所有回调返回 i==4。第二个 for 循环有效 - 但它很丑陋并且感觉“hackish”
将“i”的值放入回调函数定义中的更简洁的方法是什么?
var result = '', result2 = '';
// doesn't work; i == 4 for all
for(var i=0; i<4; i++) {
willCallBack(function(msg) {
result += msg + i + '\n';
});
}
// works, but kinda ugly
for(var i=0; i<4; i++) {
willCallBack(function(i) {
return function(msg) {
result2 += msg + i + '\n';
};
}(i));
}
// part of API, cant change
function willCallBack(cb) {
window.setTimeout(cb, 500, "can't change me");
}
// show the results
window.setTimeout(function(){
alert(result + '\n\n' + result2)
}, 1000);