如何用 JavaScript 创建一个调用每个提供函数的函数?


在 JavaScript 中,函数是一等公民对象,这意味着它们可以作为参数传递给其他函数。这是一个强大的特性,可以用来创建一些有趣的模式。

其中一种模式是 **“依次调用”** 模式,其中创建一个函数来使用它接收到的参数调用每个提供的函数。

为什么要使用依次调用模式?

您可能想要使用依次调用模式的原因有很多。

首先,它可以用作抽象化一组函数如何被调用的细节的方法。如果函数以复杂或重复的方式被调用,这将非常有用。

其次,它可以用来创建某种 **“管道”**,其中每个函数的输出都作为输入传递给链中的下一个函数。这可以成为将一系列操作串联在一起的一种方便的方法。

最后,它可以用来创建一个 **“分流”** 函数,该函数使用相同的参数调用多个函数并收集结果。这对于日志记录、调试或其他用途可能很有用。

如何实现依次调用模式?

有几种不同的方法可以实现依次调用模式。

最直接的方法是简单地遍历提供的函数并使用参数调用每个函数。

function invokeEach(functions, args) {
   for (var i = 0; i < functions.length; i++) {
      functions[i].apply(null, args);
   }
}

在上面的代码中,我们遍历函数并使用 **Function.prototype.apply()** 方法调用每个函数。此方法允许我们使用特定的 this 值和参数数组来调用函数。

我们在这里使用 **apply()** 方法,因为它是一种将参数作为数组传递的便捷方法。您也可以使用 **Function.prototype.call()** 方法,该方法允许您将参数作为单个值传递。

示例

以下是完整的可运行代码示例。

<!doctype html> <html> <head> <title>Examples</title> </head> <body> <div id="result"></div> <div id="result1"></div> <div id="result2"></div> <div id="result3"></div> <script> function foo(x) { document.getElementById("result").innerHTML = 'foo: ' + x; } function bar(x) { document.getElementById("result1").innerHTML = 'bar: ' + x; } function baz(x) { document.getElementById("result2").innerHTML = 'baz: ' + x; } function qux(x) { document.getElementById("result3").innerHTML ='qux: ' + x; } function invokeEach(functions, args) { for (var i = 0; i < functions.length; i++) { functions[i].apply(null, args); } } invokeEach([foo, bar, baz, qux], [5]); </script> </body> </html>

如您所见,上面的代码示例定义了四个函数: *foo()、bar()、baz()* 和 *qux()*。这些函数只是打印一条包含提供参数的消息。

接下来,我们定义 *invokeEach()* 函数,该函数接收一个函数数组和一个参数数组。此函数遍历提供的函数并使用提供的参数调用每个函数。

最后,我们调用 *invokeEach()* 函数,传入四个函数和单个参数 5。正如预期的那样,这将导致每个函数都使用参数 5 被调用。

在本教程中,我们研究了 JavaScript 中的依次调用模式。此模式可用于创建一个使用它接收到的参数调用每个提供的函数的函数。

我们了解了如何实现此模式,并了解了您可能想要使用它的几个原因。

更新于:2022年8月4日

浏览量:107

开启您的 职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.