在 JavaScript 中,函数是一等公民,意味着它们可以像变量一样在代码中使用。这意味着你可以将函数作为参数传递给另一个函数。
当你传递函数作为参数时,你可以利用这种能力来写出更灵活和可重用的代码。这种模式被称为高阶函数,因为它们接受其他函数作为输入。
为什么要传递函数作为参数?
通过传递函数作为参数,我们可以将通用功能与特定功能分离开来。这有助于我们编写更具可读性、可维护性和可复用性的代码。
例如,假设你想编写一个函数来查找数组中的最大值:
-- -------------------- ---- ------- -------- ------------ - --- --- - ------- --- ---- - - -- - - ----------- ---- - -- ------- - ---- - --- - ------- - - ------ ---- -
现在假设你需要在数组中查找最小值。你可以复制并粘贴 findMax
函数并对其进行修改,但是这样会导致代码冗余。相反,你可以将比较逻辑封装到一个单独的函数中,并将其传递给 find
函数。这是一个更好的解决方案:
-- -------------------- ---- ------- -------- --------- -------- - --- ------ - ------- --- ---- - - -- - - ----------- ---- - -- ---------------- ------- - -- - ------ - ------- - - ------ ------- - -------- ----------------- -- - ------ - - -- - --- ------- - --- -- -- -- --- --- --- - ------------- ----------------
现在,如果你需要找到一个数组的最小值,你可以使用 find
函数并传递一个比较函数 compareNumbers
。
如何传递函数作为参数?
将函数作为参数传递与将变量作为参数传递类似。你只需将函数名称传递给另一个函数并在该函数中调用它即可。
例如,下面是一个接受函数作为参数的 sayHello
函数:
function sayHello(name, callback) { let message = "Hello, " + name + "!"; callback(message); }
这个函数接受两个参数:一个字符串和一个回调函数。当 sayHello
被调用时,它会构造一个包含 name
的问候信息,并将该信息传递给回调函数。
现在假设你有一个显示消息的函数:
function showMessage(message) { alert(message); }
你可以将 showMessage
函数作为回调传递给 sayHello
函数:
sayHello("John", showMessage);
当 sayHello
函数被调用时,它会构造一个问候信息,然后调用 showMessage
函数并传递该信息。这将导致一个消息框弹出并显示问候语。
示例代码
以下是一个真实世界的示例,使用了 JavaScript 中的函数作为参数来创建一个数组排序函数:
-- -------------------- ---- ------- -------- -------------- ----------- - --- ---- - - -- - - ----------- ---- - --- ---- - - - - -- - - ----------- ---- - -- ------------------- ------- - -- - --- ---- - ------- ------ - ------- ------ - ----- - - - ------ ---- - -------- ----------------- -- - ------ - - -- - --- ------- - --- -- -- -- --- --- ------------- - ------------------ ---------------- --------------------------- -- -- --- -- - ----------------------------------------------------------- -------- ----------------------------------------------------------------------------------