为什么这个简单的回调函数不起作用?

时间:2013-04-13 22:01:15

标签: javascript jquery callback

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

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将打印到控制台。我做错了什么?

3 个答案:

答案 0 :(得分: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/

答案 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");

http://jsfiddle.net/mattball/YxDkg

答案 2 :(得分:1)

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

callback.apply(this,arguments);

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