解决方案是通过闭包绑定变量。
作为更基本的示例,这里有一个接收并调用回调函数的示例函数,以及一个示例回调函数:
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) {
};
};
var clicked = function() {
var extraStuff = {
myParam1: 'foo',
myParam2: 'bar'
};
$.post("someurl.php", someData, doSomething(extraStuff), "json");
};
发生了什么?
在最后一行,调用了doSomething(extraStuff)
并且该调用的结果是一个函数指针。
因为extraStuff
作为参数传递给了doSomething
,所以它在doSomething
函数内部的作用域之内。
当extraStuff
在doSomething
返回的匿名内部函数中被引用时,它被闭包绑定到外部函数的extraStuff
参数。即使在doSomething
返回之后,这也是正确的。
我没有测试上述代码,但是我在过去24小时内编写了非常相似的代码,并且按照我描述的方式工作。
当然,您可以根据个人喜好/编码标准传递多个变量而不是单个'extraStuff'对象。