【深入理解JS核心技術(shù)】15. 什么是柯里化函數(shù)

柯里化是將具有多個參數(shù)的函數(shù)轉(zhuǎn)換為一系列函數(shù)的過程,每個函數(shù)只有一個參數(shù)。Currying?以數(shù)學(xué)家Haskell Curry的名字命名。通過應(yīng)用柯里化,n 元函數(shù)將其轉(zhuǎn)換為一元函數(shù)。
讓我們舉一個 n 元函數(shù)的例子,以及它是如何變成柯里化函數(shù)的,
const multiArgFunction = (a, b, c) => a + b + c;
console.log(multiArgFunction(1, 2, 3)); // 6
const curryUnaryFunction = (a) => (b) => (c) => a + b + c;
curryUnaryFunction(1); // returns a function: b => c => 1 + b + c
curryUnaryFunction(1)(2); // returns a function: c => 3 + c
curryUnaryFunction(1)(2)(3); // returns the number 6
復(fù)制代碼Curried 函數(shù)對于提高代碼的可重用性和函數(shù)組合非常有用。
函數(shù)聲明與函數(shù)表達式
JavaScript引擎在任何代碼執(zhí)行之前,會先讀取函數(shù)聲明,并在執(zhí)行上下文中生成函數(shù)定義。而函數(shù)表達式必須等到代碼執(zhí)行到它那一行,才會在執(zhí)行上下文中生成函數(shù)定義。
// 沒問題
console.log(sum(10, 10));
function sum(num1, num2) {
return num1 + num2;
}
復(fù)制代碼代碼可以正常運行,因為函數(shù)聲明會在任何代碼執(zhí)行之前先被讀取并添加到執(zhí)行上下文。這個過程叫作函數(shù)聲明提升。
在執(zhí)行代碼時,JavaScript引擎會先執(zhí)行一遍掃描,把發(fā)現(xiàn)的函數(shù)聲明提升到源代碼樹的頂部。因此即使函數(shù)定義出現(xiàn)在調(diào)用它們的代碼之后,引擎也會把函數(shù)聲明提升到頂部。
改為函數(shù)表達式就回出錯:
// 會出錯
console.log(sum(10, 10));
let sum = function(num1, num2) {
return num1 + num2;
};
復(fù)制代碼函數(shù)作為值
因為函數(shù)名在ECMAScript中就是變量,所以函數(shù)可以用在任何可以使用變量的地方。這意味著不僅可以把函數(shù)作為參數(shù)傳給另一個函數(shù),而且還可以在一個函數(shù)中返回另一個函數(shù)。
函數(shù)表達式
定義函數(shù)有兩種方式:函數(shù)聲明和函數(shù)表達式。
函數(shù)聲明:
function functionName(arg0, arg1, arg2) {
// 函數(shù)體
}
復(fù)制代碼函數(shù)聲明的關(guān)鍵特點是函數(shù)聲明提升,即函數(shù)聲明會在代碼執(zhí)行之前獲得定義。這意味著函數(shù)聲明可以出現(xiàn)在調(diào)用它的代碼之后:
sayHi();
function sayHi() {
console.log('Hi!');
}
復(fù)制代碼因為 JavaScript 引擎會先讀取函數(shù)聲明,然后再執(zhí)行代碼。
第二種創(chuàng)建函數(shù)的方式就是函數(shù)表達式。
let functionName = function(arg0, arg1, arg2) {
// 函數(shù)體
}
復(fù)制代碼函數(shù)表達式看起來就像一個普通的變量定義和賦值,即創(chuàng)建一個函數(shù)再把它賦值給一個變量functionName。
這樣創(chuàng)建的函數(shù)叫作匿名函數(shù)(anonymous funtion),因為 function 關(guān)鍵字后面沒有標識符。(匿名函數(shù)有也時候也被稱為蘭姆達函數(shù))。
任何時候,只要函數(shù)被當作值來使用,它就是一個函數(shù)表達式。
未完結(jié)!更多內(nèi)容盡情期待下一節(jié)~
【深入理解JS核心技術(shù)】歡迎各位觀眾老爺,求點贊,求關(guān)注,求轉(zhuǎn)發(fā)~
深入理解JS核心技術(shù)
| Number | Title |
|---|---|
| 1 | 在 JavaScript 中創(chuàng)建對象的可能方式有哪些 |
| 2 | 什么是原型鏈 |
| 3 | 調(diào)用、應(yīng)用和綁定有什么區(qū)別 |
| 4 | 什么是 JSON 及其常用操作 |
| 5 | 數(shù)組切片方法的目的是什么 |
| 6 | 數(shù)組拼接方法的目的是什么 |
| 7 | 切片和拼接有什么區(qū)別 |
| 8 | 你如何比較Object和Map |
| 9 | == 和 === 運算符有什么區(qū)別 |
| 10 | 什么是 lambda 或箭頭函數(shù) |
| 11 | 什么是一級函數(shù) |
| 12 | 什么是一階函數(shù) |
| 13 | 什么是高階函數(shù) |
| 14 | 什么是一元函數(shù) |
| 15 | 什么是柯里化函數(shù) |
| 16 | 什么是純函數(shù) |
| 17 | let 關(guān)鍵字的作用是什么 |
| 18 | let 和 var 有什么區(qū)別 |
| 19 | 選擇名稱let作為關(guān)鍵字的原因是什么 |
| 20 | 如何在 switch 塊中重新聲明變量而不會出錯 |
| 21 | 什么是暫時性死區(qū) |
| 22 | 什么是 IIFE(立即調(diào)用函數(shù)表達式) |
