3 回答

TA貢獻1866條經驗 獲得超5個贊
解決方案是通過閉包綁定變量。
作為一個更基本的例子,這里是一個接收和調用回調函數的示例函數,以及一個示例回調函數:
function callbackReceiver(callback) { callback("Hello World");}function callback(value1, value2) { console.log(value1, value2);}
這會調用回調并提供單個參數?,F在你想提供一個額外的參數,所以你將回調包裝在閉包中。
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作用域的工作方式。
添加回答
舉報