在 JavaScript 中,如果函數接受一個或多個參數並傳回一個需要剩餘參數的新函數,則該函數被視為「柯里化」。柯里化是一種強大的技術,可用於從現有函數建立新函數,或「柯里化」深度為 n 的函數。
您可能想要uncurry某個函數的原因有很多。例如,您可能想要 -
在需要非柯里化函數的上下文中使用柯里化函數
將柯里化函數轉換為非柯里化形式,使其更易於閱讀或除錯
#最佳化柯里化函數的效能
有兩種方法對函數進行咖哩化 -
第一種方法是使用「Function.prototype.apply」方法。
第二種方法是使用「Function.prototype.call」方法。
「Function.prototype.apply」方法可用來儲存深度為n的函數。為此,您需要只需將“this”值和參數數組傳遞給“apply”方法。例如 -
<!doctype html> <html> <head> <title>Examples</title> </head> <body> <p>uncurry up to depth 2 using Function apply() method</p> <div id="result"></div> <script> function add(a, b) { return a + b; } function curriedAdd(a) { return function(b) { return a + b; } } // Uncurry the "curriedAdd" function up to depth 2: document.getElementById("result").innerHTML = curriedAdd.apply(null, [1]).apply(null, [2]); // 3 </script> </body> </html>
"Function.prototype.call" 方法也可用來將函式取消柯里化至深度 n。 「call」方法與「apply」方法類似,但您將「this」值和參數傳遞給「call」 i> 方法作為單獨的參數,而不是作為數組。例如 -
<!doctype html> <html> <head> <title>Examples</title> </head> <body> <p> uncurry up to depth 2 using Function call() method</p> <div id="result"></div> <script> function add(a, b) { return a + b; } function curriedAdd(a) { return function(b) { return parseInt(a) + parseInt(b); } } // Uncurry the "curriedAdd" function up to depth 2: document.getElementById("result").innerHTML = curriedAdd.call(null, [1]).call(null, [2]); // 3 </script> </body> </html>
在上面的範例中,我們使用了「call」方法來對「curriedAdd」函數進行了咖哩化。正如您所看到的,"call" 方法比 "apply" 方法稍微冗長一些,但它具有相同的效果。
使用「Function.prototype.apply」方法有什麼好處?
使用「Function.prototype.apply」方法來取消函數參考有幾個好處 -
「apply」方法比「call」方法更快。
「apply」方法比「call」方法得到更廣泛的支持。
「apply」方法比「call」方法更簡潔。
總之,柯里化是一種強大的技術,可用於從現有函數建立新函數,或「柯里化」深度為 n 的函數。
以上是如何在 JavaScript 中將函數遞歸到深度 n ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!