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

时间:2012-08-09 09:16:53

标签: javascript jquery javascript-events

我尝试编写一个泛型函数,它将函数和毫秒数作为参数,并将其设置为setTimeout函数。我试过像

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

在delayCallBack函数中

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

但是这不起作用并且给我带来javascript错误。有人可以用礼仪的方式帮助我吗?

4 个答案:

答案 0 :(得分:3)

替换

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

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

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

答案 1 :(得分:2)

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

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

您的功能可以稍微清理一下......然后再与它直接调用setTimeout没有什么不同。

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

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

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

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

答案 2 :(得分:0)

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

$("#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;
}

答案 3 :(得分:0)

我也得到了同样的错误:setTimeout调用(参数周围缺少引号?)。 Gerard Sexton的解释是正确的。

正确的代码应该是

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