更好地理解JavaScript中的回调函数

时间:2009-01-27 11:36:48

标签: javascript function callback

我理解将一个函数传递给另一个函数作为回调并让它执行,但我不理解这样做的最佳实现。我正在寻找一个非常基本的例子,如下:

var myCallBackExample = {
    myFirstFunction : function( param1, param2, callback ) {
        // Do something with param1 and param2.
        if ( arguments.length == 3 ) {
            // Execute callback function.
            // What is the "best" way to do this?
        }
    },
    mySecondFunction : function() {
        myFirstFunction( false, true, function() {
            // When this anonymous function is called, execute it.
        });
    }
};

在myFirstFunction中,如果我确实返回了新的callback(),那么它会起作用并执行匿名函数,但这对我来说似乎不是正确的方法。

8 个答案:

答案 0 :(得分:131)

你可以说

callback();

如果您想在回调中调整call的值,也可以使用this方法。

callback.call( newValueForThis);

在函数this内部将是newValueForThis

答案 1 :(得分:89)

您应该检查回调是否存在,并且是可执行函数:

if (callback && typeof(callback) === "function") {
    // execute the callback, passing parameters as necessary
    callback();
}

许多库(jQuery,dojo等)对其异步函数使用类似的模式,并为所有异步函数使用node.js(nodejs通常将errordata传递给回调)。查看他们的源代码会有所帮助!

答案 2 :(得分:34)

执行功能有三种主要可能性:

var callback = function(x, y) {
    // "this" may be different depending how you call the function
    alert(this);
};
  1. 回调(argument_1,argument_2);
  2. callback.call(some_object,argument_1,argument_2);
  3. callback.apply(some_object,[argument_1,argument_2]);
  4. 您选择的方法取决于:

    1. 您将参数存储在数组中或作为不同的变量。
    2. 您想在某个对象的上下文中调用该函数。在这种情况下,在该回调中使用“this”关键字将引用在call()或apply()中作为参数传递的对象。如果您不想传递对象上下文,请使用null或undefined。在后一种情况下,全局对象将用于“this”。
    3. Function.call的文档, Function.apply

答案 3 :(得分:6)

回调是关于信号的,而“新”是关于创建对象实例。

在这种情况下,执行“callback();”会更合适。比“返回新的回调()”因为你没有做任何带有返回值的事情。

(而且arguments.length == 3测试非常笨重,fwiw,最好检查回调参数是否存在并且是一个函数。)

答案 4 :(得分:6)

正确的实施方式是:

if( callback ) callback();

这使得回调参数可选..

答案 5 :(得分:2)

您可以使用:

if (callback && typeof(callback) === "function") {
    callback();
}

以下示例更为全面:

function mySandwich(param1, param2, callback) {
alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);
var sandwich = {toppings: [param1, param2]},
    madeCorrectly = (typeof(param1) === "string" && typeof(param2) === "string") ? true : false;
if (callback && typeof(callback) === "function") {  
    callback.apply(sandwich, [madeCorrectly]);  
  }  
}  

mySandwich('ham', 'cheese', function(correct) {
if(correct) {
    alert("Finished eating my " + this.toppings[0] + " and " + this.toppings[1] + " sandwich.");
} else {
    alert("Gross!  Why would I eat a " + this.toppings[0] + " and " + this.toppings[1] + " sandwich?");
  }
});

答案 6 :(得分:1)

function checkCallback(cb)
{
    if(cb || cb!='')
    {
        if(typeof window[cb] === 'undefined') alert('Callback function not found.');
        else window[cb].call(this,Arg1, Arg2);
    }
}

答案 7 :(得分:1)

你可以看看这个链接,我为你添加一个基本的例子来解释javascript中的回调函数。 jsfiddle

var x=0;

function testCallBack(param1, param2, callback) {
    alert('param1= ' + param1 + ', param2= ' + param2+' X='+x);
    if (callback && typeof(callback) === "function") {
        x+=1;
        alert("Calla Back x= "+x);
        x+=1;
        callback();
    }
}


testCallBack('ham', 'cheese',function(){
alert("Function X= "+x);
});