0

我第一次尝试使用回调函数并且无法使其正常工作。这是我的代码的简化版本:

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会在代码运行时打印到控制台。我究竟做错了什么?

4

3 回答 3

6

您的代码有两个问题。

首先看下定义applyhttps ://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/

于 2013-04-13T22:10:40.127 回答
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");

http://jsfiddle.net/mattball/YxDkg

于 2013-04-13T22:08:29.723 回答
1

apply 函数将 thisArg 作为第一个参数,然后将数组作为第二个参数,所以你需要这样做

callback.apply(this,arguments);

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

于 2013-04-13T22:08:48.990 回答