[英]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.