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作用域的工作方式。
添加回答
舉報
