javascript-将回调作为参数传递给函数

javascript-将回调作为参数传递给函数,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我试图编写一个通用函数,它将函数和毫秒数作为参数,并将其设置为setTimeout函数。我试着 $("#Delay").click(function() { delayCallBack(someFunction(a, b), 100); }); 在delayCallBack函数中 function delayCallBack(event, time) { setTimeout(function() { event(); }, time); }; 但这不

我试图编写一个通用函数,它将函数和毫秒数作为参数,并将其设置为setTimeout函数。我试着

$("#Delay").click(function() {
    delayCallBack(someFunction(a, b), 100);
});
在delayCallBack函数中

function delayCallBack(event, time) {
    setTimeout(function() {
        event();
    }, time);
};
但这不起作用,并向我抛出javascript错误。有人能帮我做这件事吗?

()
调用函数,所以你调用函数而不是传递它。像传递普通变量一样传递函数:

$("#Delay").click(function() {
    delayCallBack(someFunction, 100);
});

您的函数可以稍微清理一下。。。同样,这与直接调用
setTimeout
没有什么区别

function delayCallBack(callback, time) {
    setTimeout(callback, time);
}

要传递参数
a
b
,可以从现有函数中创建一个新函数,该函数部分应用
a
b
,然后传递:

$("#Delay").click(function() {
    delayCallBack(someFunction.bind(null, a, b), 100);
});
更多的。演示:

()
调用函数,因此您调用函数而不是传递函数。像传递普通变量一样传递函数:

$("#Delay").click(function() {
    delayCallBack(someFunction, 100);
});

您的函数可以稍微清理一下。。。同样,这与直接调用
setTimeout
没有什么区别

function delayCallBack(callback, time) {
    setTimeout(callback, time);
}

要传递参数
a
b
,可以从现有函数中创建一个新函数,该函数部分应用
a
b
,然后传递:

$("#Delay").click(function() {
    delayCallBack(someFunction.bind(null, a, b), 100);
});
更多的。演示:

更换

$("#Delay").click(function() {delayCallBack(someFunction(a,b), 100);});

第一行执行
someFunction(a,b)
而不是第二行执行的操作,将引用传递给要执行的函数。

Replace

$("#Delay").click(function() {delayCallBack(someFunction(a,b), 100);});


第一行执行
someFunction(a,b)
,而不是第二行执行的操作,将引用传递给要执行的函数。

这个问题在JavaScript中有一个令人惊讶的棘手答案,因为您传递的值是
a
b
。考虑Gerard Sexton的解决方案

$("#Delay").click(function() {
    delayCallBack(function() {
                      someFunction(a,b);
                  }, 100);
});
该代码的作用取决于
a
b
的定义位置以及绑定处理程序后它们会发生什么。假设我们把它放在上下文中:

$(function () {
    var a, b;
    a = b = 5;
    $("#Delay").click(function() {
        delayCallBack(function() {
                          someFunction(a,b);
                      }, 100);
    });
    a = b = 7;
}
然后将使用
a=b=7
调用
someFunction
,而不是
a=b=5
。如果需要第一个值,则必须在绑定处理程序时复制这些值。像这样:

$(function () {
    var a, b;

    function bind(a, b) {
        $("#Delay").click(function() {
            delayCallBack(function() {
                              someFunction(a,b);
                          }, 100);
        });
    }

    a = b = 5;
    bind(a, b);
    a = b = 7;
}

这个问题在JavaScript中有一个令人惊讶的棘手答案,因为您传入了值
a
b
。考虑Gerard Sexton的解决方案

$("#Delay").click(function() {
    delayCallBack(function() {
                      someFunction(a,b);
                  }, 100);
});
该代码的作用取决于
a
b
的定义位置以及绑定处理程序后它们会发生什么。假设我们把它放在上下文中:

$(function () {
    var a, b;
    a = b = 5;
    $("#Delay").click(function() {
        delayCallBack(function() {
                          someFunction(a,b);
                      }, 100);
    });
    a = b = 7;
}
然后将使用
a=b=7
调用
someFunction
,而不是
a=b=5
。如果需要第一个值,则必须在绑定处理程序时复制这些值。像这样:

$(function () {
    var a, b;

    function bind(a, b) {
        $("#Delay").click(function() {
            delayCallBack(function() {
                              someFunction(a,b);
                          }, 100);
        });
    }

    a = b = 5;
    bind(a, b);
    a = b = 7;
}

我也遇到了同样的错误:setTimeout调用(参数周围缺少引号?)。 杰拉德·塞克斯顿的解释是正确的

正确的代码应该是

$("#Delay").click(function() {delayCallBack(function(){someFunction(a,b)}, 100);});

我也遇到了同样的错误:setTimeout调用(参数周围缺少引号?)。 杰拉德·塞克斯顿的解释是正确的

正确的代码应该是

$("#Delay").click(function() {delayCallBack(function(){someFunction(a,b)}, 100);});

当您认为正在发送对它的引用时,实际上正在调用
someFunction(a,b)
,这可能不会有什么帮助。。。你实际上是在做什么呢?在a和b定义的范围内发送结果?你得到的确切错误是什么?@JørgenFogh:error I get in firebug“error:无用的setTimeout调用(参数周围缺少引号?)”。范围在功能范围内。所以我不能有a,b。它必须作为论据通过。@Senthilnathan:正如我在回答中所详述的,a和b是可以通过的。但是代码变得相当复杂。当您认为正在发送对它的引用时,实际上正在调用
someFunction(a,b)
,这可能对您没有帮助。。。你实际上是在做什么呢?在a和b定义的范围内发送结果?你得到的确切错误是什么?@JørgenFogh:error I get in firebug“error:无用的setTimeout调用(参数周围缺少引号?)”。范围在功能范围内。所以我不能有a,b。它必须作为论据通过。@Senthilnathan:正如我在回答中所详述的,a和b是可以通过的。但是代码变得相当复杂。@Jørgenfough不确定它们是什么,OP可能从
a
b
中得到
ReferenceError
,所以我把它们省略了。但是因为他没有说他有什么错误,所以不清楚。@JørgenFogh不确定它们是什么,OP可能从
a
b
中得到
ReferenceError
,所以我把它们漏掉了。但因为他没有说他有什么错误,所以还不清楚。