164

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

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 中,如果我确实返回了新的回调(),那么它会工作并执行匿名函数,但这对我来说似乎不是正确的方法。

4

8 回答 8

133

你可以说

callback();

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

callback.call( newValueForThis);

函数内部this将是任何newValueForThis内容。

于 2009-01-27T11:43:35.537 回答
91

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

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

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

于 2011-03-22T17:11:50.303 回答
34

执行函数有 3 种主要可能性:

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]);

您选择的方法取决于:

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

Function.call , Function.apply的文档

于 2009-01-27T11:52:30.400 回答
6

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

在这种情况下,只执行“callback();”会更合适。而不是“return new callback()”,因为无论如何您都没有对返回值做任何事情。

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

于 2009-01-27T11:43:31.120 回答
6

正确的实施是:

if( callback ) callback();

这使得回调参数可选..

于 2011-03-03T12:21:07.873 回答
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?");
  }
});

于 2015-12-21T18:49:52.257 回答
1

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

于 2011-04-06T16:06:53.283 回答
1

这是一个解释callback()JavaScript 函数的基本示例:

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);
});

JSFiddle

于 2015-03-24T15:08:56.923 回答