JavaScript 回调

回调函数作为作为参数传递到一个主函数,并在主函数内部调用该函数,一般用来在主函数执行完成后调用回调函数来完成某些任务。

回调函数作为作为参数传递到一个主函数,并在主函数内部调用该函数,一般用来在主函数执行完成后调用回调函数来完成某些任务。

函数执行顺序

JavaScript 函数按照它们被调用的顺序执行,不是按照定义的顺序执行。

如下面两个例子定义了 2 个函数,最终显示的是最后调用的函数的结果:

function myFirst() {
  myDisplayer("Hello");
}

function mySecond() {
  myDisplayer("Goodbye");
}

myFirst();
mySecond();
function myFirst() {
  myDisplayer("Hello");
}

function mySecond() {
  myDisplayer("Goodbye");
}

mySecond();
myFirst();

顺序控制

有时您希望更好地控制何时执行函数。

假设首先要进行计算,然后再显示结果。

我们可以调用计算器函数 myCalculator 进行计算,并返回结果,然后调用输出函数 myDisplayer 来显示结果:

function myDisplayer(some) {
  document.getElementById("demo").innerHTML = some;
}

function myCalculator(num1, num2) {
  let sum = num1 + num2;
  return sum;
}

let result = myCalculator(5, 5);
myDisplayer(result);

或者,可以调用计算器函数 myCalculator,计算结果,并在 myCalculator 内部调用 myCalculator myDisplayer 显示结果:

function myDisplayer(some) {
  document.getElementById("demo").innerHTML = some;
}

function myCalculator(num1, num2) {
  let sum = num1 + num2;
  myDisplayer(sum);
}

myCalculator(5, 5);

第一个例子的问题是你必须调用两个函数来显示结果。

第二个示例的问题是您无法阻止计算器功能显示结果。

现在是引入回调的时候了。

JavaScript 回调

回调函数作为参数传递给另一个函数。

通过将输出函数作为参数传递给计算器函数,在计算后执行参数指定的回调函数:

function myDisplayer(some) {
  document.getElementById("demo").innerHTML = some;
}

function myCalculator(num1, num2, myCallback) {
  let sum = num1 + num2;
  myCallback(sum);
}

myCalculator(5, 5, myDisplayer);

在上面的例子中, myDisplayer 是输出函数的名称,它作为参数传递给 myCalculator()

当您将函数作为参数传递时,请记住不要使用括号。

  • 正确的: myCalculator(5, 5, myDisplayer);
  • 错误的: myCalculator(5, 5, myDisplayer());

这样能增大程序的灵活性,你可以实现各种输出函数,比如:

  • 输出到控制台

    function myDisplayer2(some) {
      console.log(some);
    }
    
    myCalculator(5, 5, myDisplayer2);
    
  • 弹出消息的提示框

    function myDisplayer3(some) {
      alert(some);
    }
    
    myCalculator(5, 5, myDisplayer3);
    
  • 包装消息的内容

    function myDisplayer4(some) {
      document.getElementById("demo").innerHTML = "运算的结果是:" + some;
    }
    
    myCalculator(5, 5, myDisplayer4);
    

我们可以根据不同的场景自定义不同的输出函数,这大大提高了程序的灵活性。

何时使用回调?

上面的例子并不是很令人兴奋。

它们经过简化以教您回调语法。

回调真正闪耀的地方是异步函数,其中一个函数必须等待另一个函数执行完成后才能执行(例如等待文件加载)。

下一章将介绍异步函数。