我尝试编写一个泛型函数,它将函数和毫秒数作为参数,并将其设置为setTimeout函数。我试过像
$("#Delay").click(function() {
delayCallBack(someFunction(a, b), 100);
});
在delayCallBack函数中
function delayCallBack(event, time) {
setTimeout(function() {
event();
}, time);
};
但是这不起作用并且给我带来javascript错误。有人可以用礼仪的方式帮助我吗?
答案 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);
}
要传递参数a
和b
,您可以从现有函数中创建一个部分应用a
和b
的新函数,然后传递它:< / p>
$("#Delay").click(function() {
delayCallBack(someFunction.bind(null, a, b), 100);
});
答案 2 :(得分:0)
这个问题在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;
}
然后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);});