摘要:在編程的世界里有兩種基本類型的編程函數(shù)式編程強調將一系列的動作組合成一個體系對象式編程強調將一系列的成分聚合到一個類中對于這種弱類語言來說,它既有的特點通過或者封裝一個類又有的特點。
在編程的世界里有兩種基本類型的編程:
函數(shù)式編程(OFP):強調將一系列的“動作”組合成一個體系;
對象式編程(OOP):強調將一系列的成分聚合到一個類中;
對于javascript這種弱類語言來說,它既有OOP的特點(通過class或者prototype封裝一個類),又有OFP的特點。而接下來主要介紹一下js的OFP。
本博客主要以幾個方面介紹js的OFP:一等函數(shù),閉包,高階函數(shù),函數(shù)柯里化,函數(shù)的純度;
一等函數(shù)
定義:形容函數(shù)可以像數(shù)值一樣自由穿梭在程序的不同地方;
1)可以像數(shù)值一樣保存在一個變量之中:
const a1 = 1 const a2 = function(){...}
2)可以像數(shù)值一樣保存在數(shù)組中:
let arr = [10, 12, function(){...}]
3)可以和數(shù)值一樣成為對象的成員:
const obj = { a: 1, b: function(){...} }
4)可以像數(shù)值一樣立刻運算:
(function(){...})()
5)可以作為函數(shù)的參數(shù)
function A (){...} function B (A){...}
6)可以作為函數(shù)的返回值
function A(){ return function(){...} }
閉包
定義:(閉包的定義有多種多樣,而這里的定義是本人的理解)閉包實際上是一個函數(shù),該函數(shù)作用域能捕捉外部的綁定,并以值的形式作為外部函數(shù)的返回值;外部的綁定其實都是為了閉包的調用而定義和設置。
外部的綁定:就是外部函數(shù)定義的局部變量或者外部函數(shù)的傳參(后面會比較詳細介紹)
特點:被捕捉的外部綁定不會隨著外部函數(shù)回收而回收,而是一會被閉包所引用,一直存在。
demo:
1)自由變量
閉包函數(shù)中所綁定的外部函數(shù)的變量;
特點:
a)自由變量一定不會在閉包函數(shù)內定義;
b)自由變量可以是外部函數(shù)內的聲明,也可以是外部函數(shù)的傳參;
c)自由變量可以是變量,也可以是函數(shù);
2)變量遮蔽:
定義:兩個變量的命名相同,則出現(xiàn)變量遮蔽現(xiàn)象(該兩個變量可能存在于同一個作用域,可以能處于不同的作用域)
特點:該變量被調用時,離該變量最近的同名變量會覆蓋上面的同名變量;(簡單的說就是就近原則)
高階函數(shù)
定義:函數(shù)必須是一等函數(shù),且函數(shù)的參數(shù)中至少存在一個數(shù)參數(shù)為函數(shù)或者該函數(shù)的返回值是一個函數(shù)。
特點:擴展性好,靈活多變;
1)函數(shù)參數(shù)的高階函數(shù):
注意:每個函數(shù)參數(shù)都必須要確定它在函數(shù)中的作用和功能;
demo:
[{a:1,b:‘today’},{a:2,b:‘tomorrow’}]最大值所對應的元素;
2)閉包的高階函數(shù)
注意:通過獲取外層函數(shù)的自由變量,從而定義閉包函數(shù)的行為和作動;
函數(shù)柯里化
定義:將一個接受多個參數(shù)只調用一次的函數(shù),轉變成接受一部分參數(shù)且多次調用的函數(shù)
形式:f(a1,a2,a3,...an) 等效于fn(a1,a2)(a3,...)....(an)
特點:
每執(zhí)行一個邏輯參數(shù)都會返回一個函數(shù),知道最后一個參數(shù)調用完,參數(shù)才會執(zhí)行完。
函數(shù)的純度
純函數(shù):一個函數(shù)的輸入,輸出的值都是確定且有相同的結構,且函數(shù)內部不存在不確定的因素的函數(shù)。
優(yōu)點:
1)便于多帶帶測試; 2)輸入輸出的值結構固定,不易報錯且可預測;
缺點:
由于結構固定,所以失去了js函數(shù)的靈活性和動態(tài)性;
demo:
redux中的reducer就是一個純函數(shù)形式;
不純函數(shù):函數(shù)內部具有不確定的因素存在,常見的因素有Math.random,異步操作,輸入輸出不確定或者結構不相同等;
優(yōu)點:動態(tài)性比較好,靈活(開發(fā)中經(jīng)常出現(xiàn))
缺點:不便于預測返回的結果;
分離函數(shù)純度:
因為在日常的開發(fā)中,不純函數(shù)經(jīng)常出現(xiàn),主要是因為它不像純函數(shù)那樣處處受限制,相對靈活;然而正因為比較靈活,使得函數(shù)不好控制,處理不好就經(jīng)常出現(xiàn)錯誤;所以可以在不純函數(shù)中分離函數(shù)純度;
定義:將不純函數(shù)中純潔部分和不純部分分開處理;
做法:將純潔部分封裝在一個內部函數(shù)中,該內部函數(shù)就成為不純函數(shù)的一個私有屬性;
demo:
const A = () => { const B = (a) => { return a + 1; } return Math.random + B(); }
函數(shù)式編程具有一定的優(yōu)雅性和藝術性,很多優(yōu)秀的前端框架都包含著大量的具有函數(shù)式編程 的思想。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92195.html
摘要:函數(shù)式編程,一看這個詞,簡直就是學院派的典范。所以這期周刊,我們就重點引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數(shù)式編程就是關于如使用通用的可復用函數(shù)進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...
摘要:今天這篇文章主要介紹函數(shù)式編程的思想。函數(shù)式編程通過最小化變化使得代碼更易理解。在函數(shù)式編程里面,組合是一個非常非常非常重要的思想。可以看到函數(shù)式編程在開發(fā)中具有聲明模式。而函數(shù)式編程旨在盡可能的提高代碼的無狀態(tài)性和不變性。 最開始接觸函數(shù)式編程的時候是在小米工作的時候,那個時候看老大以前寫的代碼各種 compose,然后一些 ramda 的一些工具函數(shù),看著很吃力,然后極力吐槽函數(shù)式...
摘要:函數(shù)式編程一開始我并不理解。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。但是自從學習了函數(shù)式編程,我將循環(huán)都改成了使用和來實現(xiàn)。只有數(shù)據(jù)和函數(shù),而且因為函數(shù)沒有和對象綁定,更加容易復用。在函數(shù)式的中,這些問題不復存在。 譯者按: 當從業(yè)20的JavaScript老司機學會函數(shù)式編程時,他扔掉了90%的特性,也不用面向對象了,最后發(fā)現(xiàn)了真愛啊!!! 原文: How I rediscov...
摘要:參考鏈接面向對象編程模型現(xiàn)在的很多編程語言基本都具有面向對象的思想,比如等等,而面向對象的主要思想對象,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學習生活中會常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向對象的等等,這個編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當你新接觸一門語言的時候,有些問題是需...
閱讀 1845·2023-04-25 14:49
閱讀 3127·2021-09-30 09:47
閱讀 3119·2021-09-06 15:00
閱讀 2233·2019-08-30 13:16
閱讀 1448·2019-08-30 10:48
閱讀 2677·2019-08-29 15:11
閱讀 1297·2019-08-26 14:06
閱讀 1671·2019-08-26 13:30