Javascript 将变量传递到命名回调

Javascript 将变量传递到命名回调,javascript,callback,Javascript,Callback,好的,让我们保持简单,我有以下几点: function loopDaLoop(){ for (var i = 0; i < tempItemsLength; i++) { var product = tempItems[i]; dust.render('product', product, addProductOrFinish); } } 我知道这很简单,真的我知道。。。帮忙 编辑: 我知道我应该使用闭包,所以我尝试了,但失败了: (fun

好的,让我们保持简单,我有以下几点:

function loopDaLoop(){
    for (var i = 0; i < tempItemsLength; i++) {
        var product = tempItems[i];
        dust.render('product', product, addProductOrFinish);
    }
}
我知道这很简单,真的我知道。。。帮忙

编辑: 我知道我应该使用闭包,所以我尝试了,但失败了:

(function(i){
    dust.render('product', product, addProductOrFinish);
};(i)

有几种不同的结构可以用来解决这个问题。最简单的方法是使用
.bind()
将所需参数添加到函数调用中

function loopDaLoop(){
    for (var i = 0; i < tempItemsLength; i++) {
        var product = tempItems[i];
        dust.render('product', product, addProductOrFinish.bind(null, i));
    }
}

function addProductOrFinish(i, err, out) {
   console.log(i);
}

或者,如果addProductOrFinish可以是一个内联函数,那么它可以使用您尝试过的IIFE类型结构,如下所示:

function loopDaLoop(){
    for (var i = 0; i < tempItemsLength; i++) {
        var product = tempItems[i];
        (function(i) {
            dust.render('product', product, function(err, out) {
                console.log(i);
                // rest of your addProductOrFinish logic here
            });
        )(i);
    }
}
函数loopDaLoop(){
对于(var i=0;i
我以为bind只是为了传递这个?@xShirase-
.bind()
也可用于添加参数。它为已经要传递的任何内容预先添加参数。参见我的示例。太棒了,我刚刚学到了一些东西。@jfriend00一如既往地有用!@xShirase-我又添加了两个选项。只要你的
addProductOrFinish
函数是一个单独的函数,而不是内联函数,你就不能使用闭包方法你试过了吗。
function loopDaLoop(){
    for (var i = 0; i < tempItemsLength; i++) {
        var product = tempItems[i];
        dust.render('product', product, getAddProductOrFinish(i));
    }
}

function getAddProductOrFinish(loopArg) {
     return function(err, out) {
         return addProductOrFinish.call(this, loopArg, err, out);
     }
}

function addProductOrFinish(i, err, out) {
   console.log(i);
}
function loopDaLoop(){
    for (var i = 0; i < tempItemsLength; i++) {
        var product = tempItems[i];
        (function(i) {
            dust.render('product', product, function(err, out) {
                console.log(i);
                // rest of your addProductOrFinish logic here
            });
        )(i);
    }
}