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