我第一次尝试使用回调函数,但是无法正常工作。这是我的代码的简化版本:
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
将打印到控制台。我做错了什么?
答案 0 :(得分: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/
答案 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");
答案 2 :(得分:1)
apply function将thisArg作为第一个参数,然后将数组作为第二个参数,这样你就需要这样做
callback.apply(this,arguments);
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply