将回调作为参数传递给函数
Passing callback as a parameter to function
我试图编写一个通用函数,该函数将函数和毫秒数作为参数,并将其设置为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);
}
要传递参数a
和b
,您可以从现有函数中创建一个部分应用a
和b
的新函数,然后传递它:
$("#Delay").click(function() {
delayCallBack(someFunction.bind(null, a, b), 100);
});
更多.bind
.演示:http://jsfiddle.net/Pd5JZ/2/
这个问题在 JavaScript 中有一个令人惊讶的棘手答案,因为您传入了值 a
和 b
。考虑杰拉德·塞克斯顿的解决方案
$("#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;
}
我也遇到了同样的错误:setTimeout调用(参数周围缺少引号?杰拉德·塞克斯顿的解释是正确的。
正确的代码应该是
$("#Delay").click(function() {delayCallBack(function(){someFunction(a,b)}, 100);});
相关文章:
- 在构造控制器、服务等时作为函数参数传递之前列出的角度 JS 变量
- 作为函数参数传递的匿名函数的范围
- 通过函数参数传递id
- 将数组值作为函数参数传递
- 是否需要初始化在 Javascript 中作为“类”构造函数参数传递的变量
- JavaScript 函数参数传递数组
- Angular2 将函数参数传递给构造函数
- 为什么我不能将角度变量作为函数参数传递
- jQuery - 基于作为函数参数传递的对象构建动态 if 语句
- 停止对作为函数参数传递到新列表的对象引用
- 在 JavaScript 中将数组作为内置函数参数传递
- AngularJS将范围变量名称作为函数参数传递
- Javascript 将对象作为函数参数传递
- 在对象上调用方法或将对象作为函数参数传递的差异
- 正确的方法:始终将所有变量作为函数参数传递
- 如何将动态创建的复选框值作为函数参数传递
- 节点简斯 |将对象作为函数参数传递
- 什么是将对象属性作为函数参数传递的良好策略/模式
- 将对象作为函数参数传递.不确定如何访问这些值
- 为什么我们要将函数参数传递到$scope$申请