我正在调用一个API函数 - 它在for循环中多次进行回调。我的回调需要做一些特定于索引的事情。我无法更改willCallBack函数(它是API的一部分),我想避免创建全局变量。
以下代码段说明了此问题。第一个for循环是我的第一次尝试,但是对于所有回调它返回i == 4。第二个for-loop工作 - 但它很丑陋,感觉'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);
答案 0 :(得分:2)
“有点丑陋”版本的替代方法是让命名函数返回回调,而不是匿名的自执行函数。也许你会发现它不那么难看?
for(var i=0; i<4; i++) {
willCallBack(createCallback(i));
}
function createCallback(index) {
return function(msg) {
result2 += msg + index + '\n';
};
}