[英]Understanding higher order JavaScript functions
我正在從 Eloquent JavaScript 學習高階函數,我對類似的問題進行了研究,但找不到它。 有一個與我的相同主題和相同章節的類似問題,但這是一個基本問題。 這是類似的鏈接: Javascript 中的高階函數。
我面臨以下代碼的問題:
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
let unless = (test, then) => {
if(!test)then();
};
repeat(3, n => {
unless(n%2 == 1, () => {
console.log(`${n} is even`);
});
});
// Output:
/ → 0 is even
// → 2 is even
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
n 是您想要執行action
函數的次數。
action
函數在這里被稱為回調函數
如果你做repeat(5, console.log)
你會有:
0
1
2
3
4
你也可以執行另一個這樣的function
repeat(5, item => console.log(item));
高階函數要么接受一個函數作為參數,要么返回一個函數; unless
和repeat
接受函數作為參數。
repeat
接受一個數字和一個函數,並簡單地調用傳遞給它的任何函數,次數。
unless
接受一個值和一個函數; 如果值為假,則將調用該函數。
這表明函數可以像任何其他變量一樣傳遞:在repeat()
內部, action
指的是函數本身, action()
調用該函數以獲取其結果。
什么是高階函數?
其操作上的其他功能,無論是把他們作為參數或通過返回它們的功能,被稱為高階函數。
讓我從一個小例子開始,然后我們回到問題中的問題。
function evenNumberFilter(number) { return number%2==0 } function oddNumberFilter(number) { return !evenNumberFilter(number) } evenNumberFilter(2) // true oddNumberFilter(3) // true
現在我們知道是否調用函數
evenNumberFilter
與parameter X
如果它是偶數,它將返回true
parameter X
oddNumberFilter
如果是奇數則返回true
讓我們擴展問題並說
"I would like to have all even numbers till number 10"
"I would like to have all odd numbers till number 10"
function evenNumberFilter(number) { return number %2 == 0 } function oddNumberFilter(number) { return !evenNumberFilter(number) } function evenNumberBeforeTen() { const result = [] for(number=0; number<10; number++) { if (evenNumberFilter(number)) { result.push(number) } } return result } function oddNumberBeforeTen() { const result = [] for(number=0; number<10; number++) { if (oddNumberFilter(number)) { result.push(number) } } return result } evenNumberBeforeTen(); //[0,2,4,6,8] oddNumberBeforeTen(); //[1,3,5,7,9]
如果我們查看代碼evenNumberBeforeTen
和oddNumberBeforeTen
共享大量的公共代碼
這兩個函數之間的唯一區別是,它對evenNumberFilter
或oddNumberFilter
操作的filter
。
那么我們可以重構代碼並編寫一個可以將謂詞作為參數的通用filter
函數嗎?
謂詞:布爾值函數
P: X? {true, false}
P: X? {true, false}
。在我們的例子中,
evenNumberFilter
和oddNumberFilter
都是謂詞
function evenNumberFilter(number) { return number %2 == 0 } function oddNumberFilter(number) { return !evenNumberFilter(number) } function filter(predicate) { const result = [] for(number=0; number<10; number++) { if (predicate(number)) { result.push(number) } } return result } filter(evenNumberFilter); //[0,2,4,6,8] filter(oddNumberFilter); //[1,3,5,7,9]
現在,在上面的例子中, filter
是高階函數,因為它以函數predicate
作為參數。
讓我們進入您在問題中提到的問題。
repeat
是一個高階函數,它以number
和函數action
作為參數。
unless
是一個高階函數,它采用boolean
和函數then
作為參數
當你執行
repeat(3, n => {
unless(n%2 == 1, () => {
console.log(`${n} is even`);
});
});
repeat
首先被調用,然后它將執行3次以下的函數。 function (n) => { unless(n%2 == 1, () => { console.log(`${n} is even`); });
unless
用的布爾函數n%2==1
,其將或者true
或false
如以下參數和功能。 function() => { console.log(`${n} is even`); });
當用true
調用除非, then
它不會執行then
函數,因此不會打印日志
當除非是調用false
和then
它會執行then
函數打印記錄
一般來說,你的除非函數聽起來像 - 接受條件,測試它,然后運行回調。 重復功能聽起來像運行動作 n 次。 結果聽起來像運行操作,並檢查內部是否滿足條件,然后運行除非功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.