0

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

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

在 delayCallBack 函数中

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

但这不起作用并抛出了javascript错误。有人可以帮我做这件事吗?

4

4 回答 4

3

代替

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

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

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

于 2012-08-09T09:21:47.197 回答
2

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

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

您的函数可以稍微清理一下......然后再次与直接调用没有什么不同setTimeout......

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

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

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

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

于 2012-08-09T09:21:36.967 回答
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;
}
于 2012-08-09T09:35:08.420 回答
0

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

正确的代码应该是

$("#Delay").click(function() {delayCallBack(function(){someFunction(a,b)}, 100);});
于 2013-06-18T03:02:05.880 回答