摘要:高階函數(shù)接受和或返回另外一個函數(shù)的函數(shù)被稱為高階函數(shù)。之所以是高階,是因為它并非字符串數(shù)字或布爾值,而是從更高層次來操作函數(shù)。更高的可重用性高階函數(shù)的最大好處可能是更高的可重用性。如果沒有高階函數(shù),我們需要用循環(huán)來模仿的功能。
翻譯:瘋狂的技術(shù)宅
原文:https://medium.freecodecamp.o...
本文首發(fā)微信公眾號:jingchengyideng
歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章
把函數(shù)以數(shù)據(jù)的形式去使用,并解鎖一些強大的模式。
高階函數(shù)接受和/或返回另外一個函數(shù)的函數(shù)被稱為高階函數(shù)。
之所以是高階,是因為它并非字符串、數(shù)字或布爾值,而是從更高層次來操作函數(shù)。漂亮的元。
使用 JavaScript 中的函數(shù),你可以
將它們存儲為變量
在數(shù)組中使用它們
將它們指定為對象屬性(方法)
將它們作為參數(shù)進行傳遞
將它們從其他函數(shù)中返回
就像所有的其他數(shù)據(jù)一樣。這是關(guān)鍵所在。
函數(shù)操作數(shù)據(jù) 字符串是數(shù)據(jù)sayHi = (name) => `Hi, ${name}!`; result = sayHi("User"); console.log(result); // "Hi, User!"數(shù)字是數(shù)據(jù)
double = (x) => x * 2; result = double(4); console.log(result); // 8布爾型是數(shù)據(jù)
getClearance = (allowed) => allowed ? "Access granted" : "Access denied"; result1 = getClearance(true); result2 = getClearance(false); console.log(result1); // "Access granted" console.log(result2); // "Access denied"對象是數(shù)據(jù)
getFirstName = (obj) => obj.firstName; result = getFirstName({ firstName: "Yazeed" }); console.log(result); // "Yazeed"數(shù)組是數(shù)據(jù)
len = (array) => array.length; result = len([1, 2, 3]); console.log(result); // 3
這5種類型是所有主流語言中的一等公民。
是什么使他們成為一等公民的?你可以傳遞它們,將它們存儲在變量和數(shù)組中,將它們用作計算的輸入。你可以像使用任何數(shù)據(jù)一樣去使用它們。
函數(shù)也可以作為數(shù)據(jù)的形式去用在javascript中把函數(shù)用作數(shù)據(jù)的4種方式:
把它們當作參數(shù)傳給其它函數(shù)
把他們設(shè)定成對象屬性
保存在數(shù)組中
把它們設(shè)為變量的形式
作為參數(shù)的函數(shù)isEven = (num) => num % 2 === 0; result = [1, 2, 3, 4].filter(isEven); console.log(result); // [2, 4]
看看 filter 是如何用 isEven 來決定保留哪些數(shù)字的? isEven是一個函數(shù),是另一個函數(shù)的參數(shù)。
它由每個數(shù)字的 filter 調(diào)用,并使用返回值 true 或 false 來確定這個數(shù)字是否應(yīng)該保留或丟棄。
返回函數(shù)add = (x) => (y) => x + y;
add 需要兩個參數(shù),但不是一次全部提供。這是一個只需要 x 的函數(shù),它返回一個只需要y的函數(shù)。因為 JavaScript 允許函數(shù)成為返回值 —— 就像字符串、數(shù)字、布爾值那樣。
如果你愿意,仍然可以立即提供 x 和 y,并進行雙重調(diào)用
result = add(10)(20); console.log(result); // 30
或者先 x 后 y:
add10 = add(10); result = add10(20); console.log(result); // 30
讓我們回過頭來看最后一個例子。 add10 是用一個參數(shù)調(diào)用 add 的結(jié)果。并控制臺中輸出它。
add10 是一個函數(shù),它接受一個 y 并返回 x + y。在你提供 y 之后,它會馬上計算并返回你所要的最終結(jié)果。
更高的可重用性高階函數(shù)的最大好處可能是更高的可重用性。沒有它,JavaScript 數(shù)組的主要方法 —— map,filter 和 reduce 將不存在!
這是一個用戶列表。我們將對他們的信息進行一些計算。
users = [{ name: "Yazeed", age: 25 }, { name: "Sam", age: 30 }, { name: "Bill", age: 20 }];Map
如果沒有高階函數(shù),我們需要用循環(huán)來模仿 map 的功能。
getName = (user) => user.name; usernames = []; for (let i = 0; i < users.length; i++) { const name = getName(users[i]); usernames.push(name); } console.log(usernames); // ["Yazeed", "Sam", "Bill"]
或者我們可以這樣做!
usernames = users.map(getName); console.log(usernames); // ["Yazeed", "Sam", "Bill"]Filter
在沒有高階函數(shù)的世界中,我們?nèi)匀恍枰h(huán)來重新實現(xiàn) filter 的功能。
startsWithB = (string) => string .toLowerCase() .startsWith("b"); namesStartingWithB = []; for (let i = 0; i < users.length; i++) { if (startsWithB(users[i].name)) { namesStartingWithB.push(users[i]); } } console.log(namesStartingWithB); // [{ "name": "Bill", "age": 20 }]
或者我們可以這樣做!
namesStartingWithB = users .filter((user) => startsWithB(user.name)); console.log(namesStartingWithB); // [{ "name": "Bill", "age": 20 }]Reduce
是的,reduce......沒有更高階的功能,實現(xiàn)不了那么多很酷的東西!!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102580.html
摘要:函數(shù)式編程的定義函數(shù)是一段可以通過其名稱被調(diào)用的代碼。純函數(shù)大多數(shù)函數(shù)式編程的好處來自于編寫純函數(shù),純函數(shù)是對給定的輸入返回相同的輸出的函數(shù),并且純函數(shù)不應(yīng)依賴任何外部變量,也不應(yīng)改變?nèi)魏瓮獠孔兞俊? 一個持續(xù)更新的github筆記,鏈接地址:Front-End-Basics,可以watch,也可以star。 此篇文章的地址:JavaScript函數(shù)式編程入門經(jīng)典 正文開始 什么是函...
摘要:因為用戶不用在第一次進入應(yīng)用時下載所有代碼,用戶能更快的看到頁面并與之交互。譯高階函數(shù)利用和來編寫更易維護的代碼高階函數(shù)可以幫助你增強你的,讓你的代碼更具有聲明性。知道什么時候和怎樣使用高階函數(shù)是至關(guān)重要的。 Vue 折騰記 - (10) 給axios做個挺靠譜的封裝(報錯,鑒權(quán),跳轉(zhuǎn),攔截,提示) 稍微改改都能直接拿來用~~~喲吼吼,喲吼吼..... 如何無痛降低 if else 面...
摘要:函數(shù)式編程,一看這個詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...
摘要:一直以來沒有對函數(shù)式編程有一個全面的學(xué)習(xí)和使用,或者說沒有一個深刻的思考。是不是輕松了其實函數(shù)式編程主張的就是以抽象的方式創(chuàng)建函數(shù)。后面咱們在系統(tǒng)性的學(xué)習(xí)下函數(shù)式編程。 一直以來沒有對函數(shù)式編程有一個全面的學(xué)習(xí)和使用,或者說沒有一個深刻的思考。最近看到一些博客文章,突然覺得函數(shù)式編程還是蠻有意思的。看了些書和文章。這里記載下感悟和收獲。 歡迎團隊姜某人多多指點@姜少。 由于博客秉持著簡...
摘要:根據(jù)組件單向數(shù)據(jù)流和和事件通信機制,需要由子組件通過事件通知父組件,并在父組件中修改原始的數(shù)據(jù),完成狀態(tài)的更新。 本文同步在個人博客shymean.com上,歡迎關(guān)注 寫Vue有很長一段時間了,除了常規(guī)的業(yè)務(wù)開發(fā)之外,也應(yīng)該思考和反思一下封裝組件的正確方式。以彈窗組件為例,一種實現(xiàn)是在需要模板中引入需要彈窗展示的組件,然后通過一個flag變量來控制彈窗的組件,在業(yè)務(wù)代碼里面會充斥著冗余的彈...
閱讀 1505·2021-11-17 09:33
閱讀 1269·2021-10-11 10:59
閱讀 2902·2021-09-30 09:48
閱讀 1912·2021-09-30 09:47
閱讀 3035·2019-08-30 15:55
閱讀 2347·2019-08-30 15:54
閱讀 1500·2019-08-29 15:25
閱讀 1655·2019-08-29 10:57