3 回答
TA贡献1866条经验 获得超5个赞
解决方案是通过闭包绑定变量。
作为一个更基本的例子,这里是一个接收和调用回调函数的示例函数,以及一个示例回调函数:
function callbackReceiver(callback) { callback("Hello World");}function callback(value1, value2) { console.log(value1, value2);}
这会调用回调并提供单个参数。现在你想提供一个额外的参数,所以你将回调包装在闭包中。
callbackReceiver(callback); // "Hello World", undefinedcallbackReceiver(function(value) { callback(value, "Foo Bar"); // "Hello World", "Foo Bar"});
或者,更简单地使用ES6箭头功能:
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
至于你的具体例子,我没有.post
在jQuery中使用该函数,但是对文档的快速扫描表明回调应该是具有以下签名的函数指针:
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(extraStuff)
被调用和该调用的结果是一个函数指针。
因为extraStuff
它作为参数传递给doSomething
它在doSomething
函数的范围内。
当extraStuff
在返回的匿名内部函数中引用doSomething
它时,它被闭包到外部函数的extraStuff
参数。doSomething
返回后即使如此也是如此。
我没有测试过上面的内容,但是我在过去的24小时内编写了非常相似的代码,它的工作原理正如我所描述的那样。
您当然可以传递多个变量而不是单个'extraStuff'对象,具体取决于您的个人偏好/编码标准。
TA贡献1856条经验 获得超11个赞
使用时doSomething(data, myDiv)
,实际上是调用函数而不是引用它。
您可以doStomething
直接传递函数,但必须确保它具有正确的签名。
如果你想按照它的方式保持doSomething,你可以将它的调用包装在一个匿名函数中。
function clicked() { var myDiv = $("#my-div"); $.post("someurl.php",someData, function(data){ doSomething(data, myDiv) },"json"); }function doSomething(curData, curDiv) { ...}
在匿名函数代码中,您可以使用封闭范围中定义的变量。这是Javascript作用域的工作方式。
添加回答
举报