摘要:函數(shù)式編程的特點(diǎn)函數(shù)是第一等公民,因?yàn)榻泻瘮?shù)式編程,因此函數(shù)的地位是最高的,也就是說比起變量函數(shù)的地位更高一點(diǎn)。高階函數(shù)是對(duì)其他函數(shù)進(jìn)行操作的函數(shù),可以將它們作為參數(shù)或返回它們。常見的高階函數(shù)有排序過濾
1:基本概念
函數(shù)式編程是一種編程思維方式,并不是一些語法規(guī)則,對(duì)于復(fù)用性高的功能代碼進(jìn)行一定的函數(shù)封裝,實(shí)現(xiàn)了代碼的高可復(fù)用性(主要目的)。
函數(shù)式編程的特點(diǎn):
函數(shù)是第一等公民,因?yàn)榻泻瘮?shù)式編程,因此函數(shù)的地位是最高的,也就是說比起變量函數(shù)的地位更高一點(diǎn)。
只用表達(dá)式而不用語句,表達(dá)式就是聲明式的意思,語句就是命令式的,盡量使用表達(dá)式或者是聲明式的代碼來組織邏輯。
沒有副作用的代碼,也叫做純函數(shù)或者在一些開發(fā)框架中也叫作純主鍵,純的意思是輸入一定那么輸出也一定。
不修改狀態(tài)。
引用透明。
2:函數(shù)是一等公民理解:函數(shù)在整個(gè)JavaScript代碼里面一般來講有四種,第一種叫做聲明函數(shù)、然后是表達(dá)式函數(shù)、匿名函數(shù)以及自執(zhí)行函數(shù)。
為什么函數(shù)是一等公民?
函數(shù)聲明優(yōu)先級(jí)高于變量聲明和函數(shù)表達(dá)式
console.log(getName); getName(); var getName; getName = "Eric"; function getName(){ console.log("function getName"); } console.log(getName); //? getName(){ console.log("function getName"); } // function getName // Eric
函數(shù)應(yīng)用
//聲明函數(shù) function getName(){ } //表達(dá)式函數(shù)(直接賦給一個(gè)變量) var getName = function(){ } //匿名函數(shù)(沒有名字) setTimeout(function(){ },1000); //自執(zhí)行函數(shù)(IIFE) (function(){ })();3:純函數(shù)
特點(diǎn):
對(duì)于相同的輸入,永遠(yuǎn)會(huì)得到相同的輸出
function getNumber(num){ return num + Math.random(); }
不改變輸入值
function getGirlGift(list){ // 輸入值改變 list = list.map(girl => { girl.gift = girl.age > 18 ? "big" : "small"; }); return list; }
不包含副作用(網(wǎng)絡(luò)、I/O)
var array = [1,2,3,4,5]; array.slice(0,3); array.slice(0,3); //?[1, 2, 3] // 改變?cè)瓟?shù)組 array.splice(0,3); array.splice(0,3); //?[4, 5] //網(wǎng)絡(luò)請(qǐng)求 asiox.get("https://www.xxxx.com").then(res => { }) //時(shí)間 function getDate(){ return new Date(); }
Array函數(shù)舉例
以數(shù)組為例,純與不純函數(shù)有哪些: //不純:調(diào)用數(shù)組之后改變了原數(shù)組。 array.push(); 數(shù)組尾部插入 array.pop(); 刪除并返回?cái)?shù)組最后一個(gè)元素 array.unshift(); 數(shù)組頭部插入 array.shift(); 刪除并返回?cái)?shù)組第一元素 array.splice(); 刪除元素,并向數(shù)組添加元素 array.reverse(); 顛倒數(shù)組元素的順序 array.sort(); 排序數(shù)組元素 //數(shù)組純函數(shù):調(diào)用數(shù)組的方法不改變?cè)瓟?shù)組。 array.slice(); 數(shù)組中返回選定的元素 array.concat(); 連接數(shù)組,并發(fā)揮新數(shù)組 array.join(); 按分隔符連接數(shù)組,返回字符串4:函數(shù)柯里化
定義:傳遞給函數(shù)的一部分參數(shù)來調(diào)用它,讓它返回一個(gè)函數(shù)去處理剩下的參數(shù)。
柯里化是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。例如:
// 普通的add函數(shù) function add(x, y) { return x + y } add(1,2); // 3 // 柯里化改編后 function addX(y) { return function (x) { return x + y; } } addX(2)(1); // 3 // 函數(shù)不純 - 硬編碼 - 依賴min參數(shù) var min = 90; var isWell = score => score > min; // 柯里化改編 var min = 90; var chekoLevel = baseLine => (score => score > baseLine); var isWell = chekoLevel(90); // isWell(90) false // isWell(940) true
實(shí)際上就是把a(bǔ)dd函數(shù)的x,y兩個(gè)參數(shù)變成了先用一個(gè)函數(shù)接收x然后返回一個(gè)函數(shù)去處理y參數(shù)。現(xiàn)在思路應(yīng)該就比較清晰了,就是只傳遞給函數(shù)一部分參數(shù)來調(diào)用它,讓它返回一個(gè)函數(shù)去處理剩下的參數(shù)。
一種對(duì)參數(shù)的緩存
用在一些區(qū)分環(huán)境的函數(shù)預(yù)緩存
已獲取某些耗時(shí)操作結(jié)果緩存
5:函數(shù)組合在函數(shù)式編程思想之前,出現(xiàn)過一個(gè)函數(shù)嵌套的現(xiàn)象,函數(shù)嵌套是一個(gè)函數(shù)的執(zhí)行結(jié)果它是另外一個(gè)函數(shù)的入?yún)ⅲ话銇碇v是兩層,但是兩層以上或者更多也是可能的。比如下面的代碼,它的意思是function13的結(jié)果作為function2的入?yún)ⅲ缓骹unction2的結(jié)果又作為function1的入?yún)ⅰ_@樣的寫法不太好理解而且容易混亂,因此在這個(gè)基礎(chǔ)上,衍生了函數(shù)式編程的另外一個(gè)思想,叫做函數(shù)組合。
函數(shù)組合是通過另外一個(gè)函數(shù)去組合嵌套函數(shù),但是函數(shù)本身的嵌套關(guān)系,依賴關(guān)系是不會(huì)改變的。只不過是通過另外一個(gè)函數(shù)完成一個(gè)組裝。
函數(shù)嵌套
function1(function2(function13(x)));
函數(shù)組合
var compose = (function1, function2) => (x => function1(function2(x))); var function1 = param => param + 1; var function2 = param => param + 2; var final = compose(function1, function2); final(1); // 46:Point Free
不要命名轉(zhuǎn)瞬即逝的中間變量。
var getSplitWord = str => str.toUpperCase().split(" "); //柯里化封裝 var toUpperCase = word => word.toUpperCase(); var split = x => str => str.split(x); var getSplitWord = compose(split(" "), toUpperCase);7:聲明式代碼
var students = [{ name: "Eric", score: 99, }, { name: "Iven", score: 59, } }]; //命令式 const getWell =students => { let result = []; for (let i = 0; i < students.length; i++){ if (students[i].score >= 90){ result.push(students[i]) } } return result; } //聲明式 const getWell = students => return students.filler(student => students.score >= 90);8:高階函數(shù)
把函數(shù)當(dāng)參數(shù),把傳入的函數(shù)做一個(gè)封裝。
function add(x,y,f){ return f(x) + f(y); }
高階函數(shù)是對(duì)其他函數(shù)進(jìn)行操作的函數(shù),可以將它們作為參數(shù)或返回它們。 簡單來說,高階函數(shù)是一個(gè)函數(shù),它接收函數(shù)作為參數(shù)或?qū)⒑瘮?shù)作為輸出返回。
常見的高階函數(shù)有:
Array.map
var array = [1,2,3]; array.map(s => s + 1); // [2, 3, 4]
Array.sort(排序)
Array.filter(過濾)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106011.html
摘要:函數(shù)式編程,一看這個(gè)詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語言的理解更加融會(huì)貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...
摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫遵循的實(shí)際標(biāo)準(zhǔn)。與輕量級(jí)函數(shù)式編程的概念相反,它以火力全開的姿態(tài)進(jìn)軍的函數(shù)式編程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),...
摘要:所支持的面向?qū)ο缶幊贪ㄔ屠^承。發(fā)明于年的就是首批支持函數(shù)式編程的語言之一,而演算則可以說是孕育了這門語言。即使在今天,這個(gè)家族的編程語言應(yīng)用范圍依然很廣。 1. 能說出來兩種對(duì)于 JavaScript 工程師很重要的編程范式么? JavaScript 是一門多范式(multi-paradigm)的編程語言,它既支持命令式(imperative)/面向過程(procedural)編程...
摘要:所支持的面向?qū)ο缶幊贪ㄔ屠^承。發(fā)明于年的就是首批支持函數(shù)式編程的語言之一,而演算則可以說是孕育了這門語言。即使在今天,這個(gè)家族的編程語言應(yīng)用范圍依然很廣。 1. 能說出來兩種對(duì)于 JavaScript 工程師很重要的編程范式么? JavaScript 是一門多范式(multi-paradigm)的編程語言,它既支持命令式(imperative)/面向過程(procedural)編程...
摘要:所支持的面向?qū)ο缶幊贪ㄔ屠^承。發(fā)明于年的就是首批支持函數(shù)式編程的語言之一,而演算則可以說是孕育了這門語言。即使在今天,這個(gè)家族的編程語言應(yīng)用范圍依然很廣。 1. 能說出來兩種對(duì)于 JavaScript 工程師很重要的編程范式么? JavaScript 是一門多范式(multi-paradigm)的編程語言,它既支持命令式(imperative)/面向過程(procedural)編程...
閱讀 2674·2021-11-25 09:43
閱讀 2586·2021-11-22 09:34
閱讀 2848·2021-11-12 10:34
閱讀 1439·2021-10-20 13:46
閱讀 2306·2019-08-30 13:21
閱讀 934·2019-08-30 11:21
閱讀 486·2019-08-30 11:20
閱讀 2190·2019-08-29 17:20