簡體   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