执行外部功能Vs。使用回调函数-何时使用其中一个?

时间:2019-10-19 01:39:32

标签: javascript function callback executioncontext

据说回调通过将回调函数的值(其函数定义)传递给“高阶”函数的参数来传递和执行,从而为高阶函数增加了功能。

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

以下内容更好地说明了我想说的话。

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

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'

虽然它们返回的值在两者之间没有差异,但是它们的执行方式却有所不同。

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

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

也许这个例子太简单了,以至于看不到两者之间的差异,这可以帮助我理解何时将一个使用在另一个上。

1 个答案:

答案 0 :(得分:1)

想象一下,有时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'

没有回调就无法做到这一点。

真的,这就是为什么参数通常具有强大功能的原因。将不同的参数传递给函数可以使代码以没有代码(或等效机制)无法实现的方式动态化。