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

Passing callback as a parameter to function

本文关键字:函数 参数传递 回调      更新时间:2023-09-26

我试图编写一个通用函数,该函数将函数和毫秒数作为参数,并将其设置为setTimeout函数。我试过:喜欢

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

delayCallBack函数中:

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

但这不起作用,并且给我抛出了JavaScript错误。有人可以帮助我以正确的方式做到这一点吗?

替换

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

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

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

()调用

函数,因此您可以调用该函数而不是传递它。像普通变量一样传递函数:

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

您的函数可以稍微清理一下...话又说回来,这和直接打电话给setTimeout没什么区别。

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

要传递参数ab,您可以从现有函数中创建一个部分应用ab的新函数,然后传递它:

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

更多.bind .演示:http://jsfiddle.net/Pd5JZ/2/

这个问题在 JavaScript 中有一个令人惊讶的棘手答案,因为您传入了值 ab 。考虑杰拉德·塞克斯顿的解决方案

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

该代码的作用取决于定义ab的位置以及绑定处理程序后它们会发生什么情况。假设我们把它放在上下文中:

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

然后someFunction将用 a=b=7 调用,而不是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);});