执行外部函数与。使用回调函数——何时使用一个或另一个?

Executing an Outside Function Vs. Using a Callback Function -- when to use one or the other?

据说回调通过将回调函数(它的函数定义)的值传递给 'higher-order' 函数的参数来为高阶函数添加功能,并在其中传递并执行。

看来我们可以简单地通过从另一个正在执行的函数中调用一个外部函数来完成同样的事情。

以下更能说明我的意思。

// ************************ 使用回调 **************** *********************************

function A() { // this is the callback function
    return 'hello';
};

function B(callback) { // this is considered a 'higher-order' function because it takes a
                       // function definition as a parameter. the function definition of A
                       // -- taken from A in Global memory -- is assigned to callback
    var output = callback(); // we call callback and run it
                             // the value of callback, is assigned to the variable output 
    console.log(output);
    console.log("goodbye")
};

B(A); // logs 'hello' 'goodbye'

// ******* 将上面的内容与从另一个函数中调用外部函数进行比较 *****

function A() { 
    return 'hello';
};

function B() {
    var output = A(); // we call function A, from inside function B,
            // the value returned by A, is assigned to a variable inside B
    console.log(output);
    console.log("goodbye")
};

B(); // logs 'hello' 'goodbye'

虽然两者在值方面没有区别 return,但它们的执行方式却有所不同。

回调函数接受 A 的函数定义并将其附加到一个名为回调的新名称。回调被执行,回调的本地执行上下文中运行。

将此与我们从 B 内部调用 A 时发生的情况进行比较,A 在其自己的本地执行上下文中执行。

也许这个例子太简单了,看不出两者之间的区别,这有助于我理解什么时候我会用一个而不是另一个。

想象一下 B 有时被传递给 A,但其他时候被传递给一个名为 C 的函数。如果 B 直接调用一个函数,它只能调用那个函数。但是如果它传递了一个函数来调用,它可以调用传递给它的任何函数:

function A() {
    return 'hello';
};

function C() {
    return 'Привет';
};

function B(callback) {
    var output = callback();

    console.log(output);
    console.log("goodbye")
};

B(A);
// => 'hello'
// => 'goodbye'
B(C);
// => 'Привет'
// => 'goodbye'

没有回调就做不到。

真的,这就是为什么论证通常很强大的原因。将不同的参数传递给函数允许代码以没有它们(或等效机制)时不可能的方式动态化。