解决方案是通过闭包绑定变量。
作为一个更基本的例子,这里有一个接收和调用回调函数的例子函数,以及一个回调函数的例子:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
这将调用回调函数并提供一个参数。现在你想要提供一个额外的参数,所以你用闭包包装回调。
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
或者,更简单地使用ES6箭头函数:
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
至于你的具体例子,我没有在jQuery中使用过.post函数,但快速扫描文档建议回调应该是一个具有以下签名的函数指针:
function callBack(data, textStatus, jqXHR) {};
因此我认为解决方法如下:
var doSomething = function(extraStuff) {
return function(data, textStatus, jqXHR) {
// do something with extraStuff
};
};
var clicked = function() {
var extraStuff = {
myParam1: 'foo',
myParam2: 'bar'
}; // an object / whatever extra params you wish to pass.
$.post("someurl.php", someData, doSomething(extraStuff), "json");
};
发生了什么?
在最后一行中,调用doSomething(extrastutff),调用的结果是一个函数指针。
因为extraStuff是作为参数传递给doSomething的,所以它在doSomething函数的范围内。
当在返回的匿名内部函数doSomething中引用extraStuff时,它通过闭包绑定到外部函数的extraStuff参数。即使在doSomething返回之后也是如此。
我还没有对上面的代码进行测试,但我在过去24小时内编写了非常类似的代码,它的工作原理正如我所描述的那样。
当然,你可以传递多个变量,而不是一个“extraStuff”对象,这取决于你的个人偏好/编码标准。