在 JavaScript 函数中传递函数作为参数

在 JavaScript 中,函数是一等公民,意味着它们可以像变量一样在代码中使用。这意味着你可以将函数作为参数传递给另一个函数。

当你传递函数作为参数时,你可以利用这种能力来写出更灵活和可重用的代码。这种模式被称为高阶函数,因为它们接受其他函数作为输入。

为什么要传递函数作为参数?

通过传递函数作为参数,我们可以将通用功能与特定功能分离开来。这有助于我们编写更具可读性、可维护性和可复用性的代码。

例如,假设你想编写一个函数来查找数组中的最大值:

-------- ------------ -
  --- --- - -------
  --- ---- - - -- - - ----------- ---- -
    -- ------- - ---- -
      --- - -------
    -
  -
  ------ ----
-

现在假设你需要在数组中查找最小值。你可以复制并粘贴 findMax 函数并对其进行修改,但是这样会导致代码冗余。相反,你可以将比较逻辑封装到一个单独的函数中,并将其传递给 find 函数。这是一个更好的解决方案:

-------- --------- -------- -
  --- ------ - -------
  --- ---- - - -- - - ----------- ---- -
    -- ---------------- ------- - -- -
      ------ - -------
    -
  -
  ------ -------
-

-------- ----------------- -- -
  ------ - - --
-

--- ------- - --- -- -- -- ---
--- --- - ------------- ----------------

现在,如果你需要找到一个数组的最小值,你可以使用 find 函数并传递一个比较函数 compareNumbers

如何传递函数作为参数?

将函数作为参数传递与将变量作为参数传递类似。你只需将函数名称传递给另一个函数并在该函数中调用它即可。

例如,下面是一个接受函数作为参数的 sayHello 函数:

-------- -------------- --------- -
  --- ------- - ------- - - ---- - ----
  ------------------
-

这个函数接受两个参数:一个字符串和一个回调函数。当 sayHello 被调用时,它会构造一个包含 name 的问候信息,并将该信息传递给回调函数。

现在假设你有一个显示消息的函数:

-------- -------------------- -
  ---------------
-

你可以将 showMessage 函数作为回调传递给 sayHello 函数:

---------------- -------------

sayHello 函数被调用时,它会构造一个问候信息,然后调用 showMessage 函数并传递该信息。这将导致一个消息框弹出并显示问候语。

示例代码

以下是一个真实世界的示例,使用了 JavaScript 中的函数作为参数来创建一个数组排序函数:

-------- -------------- ----------- -
  --- ---- - - -- - - ----------- ---- -
    --- ---- - - - - -- - - ----------- ---- -
      -- ------------------- ------- - -- -
        --- ---- - -------
        ------ - -------
        ------ - -----
      -
    -
  -
  ------ ----
-

-------- ----------------- -- -
  ------ - - --
-

--- ------- - --- -- -- -- ---
--- ------------- - ------------------ ----------------

--------------------------- -- -- --- --

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------