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

IT技术 javascript function callback
2021-02-04 23:22:23

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

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

6个回答

你只能说

callback();

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

callback.call( newValueForThis);

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

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

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

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

我很好奇为什么你需要回调的第一个断言......是检查空值还是未定义?不会typeof(callback)为您实现这一目标吗? typeof(null) === "Object",typeof("undefined") === "undefined"
2021-03-11 23:22:23
短路与。如果回调不存在,不要费心计算它的类型。虽然,你是对的。typeof() 不需要它,但我会做一个 jsperf 看看短路是否值得。
2021-03-14 23:22:23
为什么要转换callback为字符串然后检查其类型?这会提高性能吗?这就像检查类型,检查转换后的布尔值是否返回 true,然后再次检查其类型并针对字符串进行测试......你能解释一下为什么吗?
2021-04-01 23:22:23
@headacheCoder -callback没有被转换为字符串,在调用它之前会检查它的类型以查看它是否是一个函数。代码大概接受callback作为参数,并且不确定该参数是可调用类型——或者参数可能是各种类型,以尝试提供一种多态形式,其中代码可能对不同的typeof参数做出不同的反应
2021-04-05 23:22:23

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

var callback = function(x, y) {
    // "this" may be different depending how you call the function
    alert(this);
};
  1. 回调(参数_1,参数_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.callFunction.apply 的文档

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

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

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

正确的实施是:

if( callback ) callback();

这使得回调参数可选..

如果回调参数不是函数怎么办?
2021-03-18 23:22:23