Javascript 为什么不是';这个简单的回调函数不工作吗?
我第一次尝试使用回调函数,但很难让它正常工作。以下是我的代码的简化版本:Javascript 为什么不是';这个简单的回调函数不工作吗?,javascript,jquery,callback,Javascript,Jquery,Callback,我第一次尝试使用回调函数,但很难让它正常工作。以下是我的代码的简化版本: var unsavedChanges = 1; function saveData(callback) { // save data if(typeof callback === "function") { unsavedChanges = 0; callback.apply(arguments); } } function nextStep(val)
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:
在真正的“saveData”函数中,我使用$.ajax()
保存数据,并且在.done()
函数中有回调。这样,如果页面上有未保存的数据,则会保存该数据,然后执行调用的原始函数
使用此代码,当代码运行时,值
undefined
将打印到控制台。我做错了什么?如果要使用接受参数的回调,最简单、惯用的方法是传递一个闭包,该闭包负责传递参数:
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作为第一个Argment,然后将数组作为第二个参数,因此需要执行此操作
callback.apply(this,arguments);
您的代码有两个问题 首先,看看
apply
的定义:
您缺少第一个参数thisArg
,它应该在您应用的函数中用作this
其次,我认为您实际上不想将参数
传递给apply。除了第一个参数之外,您需要的是所有参数,因为第一个参数是callback
。因此,您可以使用Array.prototype.slice.call(arguments).slice(1)
获取除第一个之外的所有参数,并将其传递到apply
这里有一个处理这些更改的工具:
回调。应用(参数)
?您正在将回调应用于回调???@elclans我知道这样做会调用带有参数的回调函数。也就是说,它与执行回调相同(参数[1],…)代码>,但其优点是参数不必硬编码。您可以发布“真实”代码吗。很难确定什么是参数
,是包含回调
的集合,还是完成
的参数(因为您提到它被包装在完成
中)。请告诉我,并给出可靠的解释+1但是,这不是完整的修复,因为它不会记录“测试”
。