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

163 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.
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

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

kro*_*old 131

你可以说

callback();
Run Code Online (Sandbox Code Playgroud)

或者,call如果要调整this回调中的值,可以使用该方法.

callback.call( newValueForThis);
Run Code Online (Sandbox Code Playgroud)

函数内部this将是任何东西newValueForThis.


aru*_*ngh 90

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

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

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


Ion*_*tan 34

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

var callback = function(x, y) {
    // "this" may be different depending how you call the function
    alert(this);
};
Run Code Online (Sandbox Code Playgroud)
  1. 回调(argument_1,argument_2);
  2. callback.call(some_object,argument_1,argument_2);
  3. callback.apply(some_object,[argument_1,argument_2]);

您选择的方法取决于:

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

Function.call, Function.apply的文档


ann*_*ata 6

回调是关于信号的,而"新"是关于创建对象实例.

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

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


小智 6

适当的实施将是:

if( callback ) callback();
Run Code Online (Sandbox Code Playgroud)

这使得回调参数可选..