[英]Why isn't this simple callback function working?
我正在嘗試第一次使用回調函數,但無法使其正常工作。 這是我的代碼的簡化版本:
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
的值將輸出到控制台。 我究竟做錯了什么?
您的代碼有兩個問題。
首先,查看一下apply
的定義: https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply
你錯過了第一個參數thisArg
,這是應該作為this
你申請的功能中。
其次,我認為您實際上並不希望將arguments
傳遞給apply。 您想要的只是第一個參數,因為第一個參數是callback
。 因此,您可以使用Array.prototype.slice.call(arguments).slice(1)
獲取除第一個參數外的所有參數,並將其傳遞給apply
。
這是進行這些更改的有效方法: http : //jsfiddle.net/UkdT7/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");
apply函數將thisArg作為第一個引數,然后將數組作為第二個參數,因此您需要執行此操作
callback.apply(this,arguments);
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Function/apply
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.