Javascript for循环中实例化的多个回调的访问索引

Javascript for循环中实例化的多个回调的访问索引,javascript,Javascript,我在for循环中多次调用一个API函数(它接受回调)。我的回调需要执行特定于索引的操作。我不能更改willCallBack函数(它是API的一部分),我希望避免创建全局变量 下面的代码片段说明了这个问题。第一个for循环是我的第一次尝试,但对于所有回调,它返回i==4。第二个for循环可以工作——但它很难看,而且感觉很“粗糙” 将“i”的值放入回调函数定义的更干净的方法是什么 var result = '', result2 = ''; // doesn't work; i == 4 for

我在for循环中多次调用一个API函数(它接受回调)。我的回调需要执行特定于索引的操作。我不能更改willCallBack函数(它是API的一部分),我希望避免创建全局变量

下面的代码片段说明了这个问题。第一个for循环是我的第一次尝试,但对于所有回调,它返回i==4。第二个for循环可以工作——但它很难看,而且感觉很“粗糙”

将“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);
var result='',result2='';
//不起作用;i=全部为4
对于(var i=0;i您的“有点难看”版本的替代方案是让一个命名函数返回回调,而不是一个匿名的、自动执行的函数。也许您会发现它不那么难看

for(var i=0; i<4; i++) {
    willCallBack(createCallback(i));
}

function createCallback(index) {
    return function(msg) {
        result2 += msg + index + '\n';
    };
}

for(var i=0;iWell,有点难看,但我能想到的最短解决方案是在旁观者的眼中,难看的作品。。。