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但是,这不是完整的修复,因为它不会记录
“测试”