繁体   English   中英

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

[英]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");

http://jsfiddle.net/mattball/YxDkg

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM