2013-04-13 185 views
0

我想第一次使用回調函數,並且無法正常工作。這裏是我的代碼的簡化版本:這個簡單的回調函數爲什麼不起作用?

var unsavedChanges = 1; 

function saveData(callback) 
{ 
    // save data 

    if(typeof callback === "function") 
    { 
     unsavedChanges = 0; 
     callback.apply(arguments); 
    } 
} 

function nextStep(val) 
{ 
    if(unsavedChanges == 1) 
    { 
     saveData(nextStep, val); 
     return false; 
    } 

    console.log(val); 
} 

nextStep("test"); 

的jsfiddle:http://jsfiddle.net/tXqn3/

在我的真正的「SAVEDATA」功能,我使用$.ajax()保存數據和我在.done()函數的回調。所以,這樣,如果頁面上有未保存的數據,那麼它將被保存,然後被調用的原始函數被執行。

使用此代碼,值undefined會在代碼運行時打印輸出到控制檯。我究竟做錯了什麼?

+1

'callback.apply(參數)'?您正在將回調應用於回調? – elclanrs

+0

@elclanrs我讀過這樣做,用參數調用回調函數。即它和'callback(arguments [1],...);'一樣,但是優點是參數不必被硬編碼。 – Nate

+0

你可以發佈「真實」的代碼嗎?很難確定'arguments'是什麼,如果它是包含'callback'的集合,或者它是'done'的參數(因爲您提到它包含在'done'中)。 – Joseph

回答

6

您的代碼有兩個問題。

首先,看看apply定義:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

你錯過了第一個參數thisArg,這是應該作爲你申請在函數中this

二,我不認爲你真的想通過arguments進入申請。你想要的只是第一個參數,因爲第一個參數是callback。因此,您可以使用Array.prototype.slice.call(arguments).slice(1)獲取除第一個以外的所有參數,並將其傳入apply

這裏的工作撥弄着這些變化:http://jsfiddle.net/UkdT7/1/

+0

打敗了我,並給出了可靠的解釋。 +1 –

1

如果要使用接受參數的回調,最簡單的,慣用的方式做到這一點是通過一個封閉它接受參數傳遞的護理:

var unsavedChanges = 1; 

function saveData(callback) 
{ 
    // save data 

    if(typeof callback === "function") 
    { 
     unsavedChanges = 0; 
     callback(); // no callback.apply 
    } 
} 

function nextStep(val) 
{ 
    if(unsavedChanges == 1) 
    { 
     saveData(function() { 
      nextStep(val); 
     }); 
     return false; 
    } 

    console.log(val); 
} 

nextStep("test"); 

http://jsfiddle.net/mattball/YxDkg

+0

非常優雅,謝謝! – Nate

相關問題