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

front end technologyjavascriptweb development

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

其中一种模式是"invoke-each"模式,其中创建一个函数,使用其接收的参数调用每个提供的函数。

为什么使用 Invoke-Each 模式?

您可能想要使用 Invoke-each 模式的原因有几个。

首先,它可以用作抽象一组函数如何调用细节的一种方式。如果函数以复杂或重复的方式调用,这会很有帮助。

其次,它可用于创建各种"管道",其中每个函数的输出作为输入传递给链中的下一个函数。这是一种将一系列操作串联在一起的便捷方法。

最后,它可用于创建"tee"函数,该函数使用相同的参数调用多个函数并收集结果。这对于日志记录、调试或其他目的很有用。

如何实现 Invoke-Each 模式?

有几种不同的方法可以实现 Invoke-Each 模式。

最直接的方法是简单地循环提供的函数并使用参数调用每个函数 -

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 中的invoke-each 模式。此模式可用于创建一个函数,该函数使用其接收的参数调用每个提供的函数。

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


相关文章