文章出自我的博客https://knightyun.github.io/2019/01/27/programming-paradigm,轉載請申明git
不少語言是聚範式/多重範式編程,即支持多在編程範式,如面向對象(Java),面向過程(C語言),泛函(函數式),元程序設計等;如下例子都用 JavaScript 舉例;github
命令式編程(Imperative)
如命令通常指導程序一步步完成功能,如 for 循環:編程
function myFn(n) { for (i = 0; i < 3; i++) { n++; } console.log(n); } myFn(0); // 3
函數式編程/聲明式(Functional/Declarative)
函數式編程特色:數組
- 函數式編程是聲明式的;
- 提倡純函數理念,變量私有,不一樣於面向對象編程的成員共享;
- 無反作用,不影響其餘外部變量;
- 有些相似初中數學純函數f(x)的定義,提供輸入值,返回新的輸出值,每次提供相同輸入值總能返回相同輸出值,使線程安全可靠;
Array.map(); // 純函數,輸出惟一 Math.random(); // 非純函數,輸出不惟一
- 函數的大量使用,變量中存儲函數,動態建立函數,返回值爲函數,函數做爲參數傳遞,等等;
// 字符串經過函數儲存在變量中 var myStr = function(){return 'Hello World'}; console.log(myStr); // Hello World // 對象屬性值儲存爲函數 var myObj = { name: 'Cloud', getName: function(){ return this.name; } } console.log(myObj.getName()); // Cloud // 動態建立函數,用時調用,用完銷燬 console.log('Hello ' + (function(){ return 'World'; })()); // Hello World // 函數做爲參數進行傳遞 function paraFn() { return 'Hello'; } function myFn(a, b) { return a + b; } console.log(myFn(paraFn(), 'World')); // Hello World // 函數做爲返回值 function myFn2() { var a = 'Hello '; return function(){ return a + 'World'; } } console.log(myFn2()()); // Hello World
**總結:**例如for循環一個數組,命令式即是寫出具體循環的方式,聲明式即是隻寫聲明函數,只要循環結果,具體方式交給程序執行;安全
例如:dom
// 命令式 var a = [1, 2, 3]; var b = []; for (i = 0; i < 3; i++) { b.push(a[i] * a[i]); } console.log(b); // [1, 4, 9] // 聲明式 var a = [1, 2, 3]; var b = a.map(function(i){ return i * i; }); console.log(b); // [1, 4, 9]
一樣的結果,代碼量和理解難易上,聲明式都明顯優於命令式對吧;函數式編程
聲明式編程:函數
特色:this
-
說明想要實現的功能,讓機器完成步驟以及如何實現;spa
-
免去一些沒必要要的命令步驟,讓思惟集中在功能開發上,而不是冗長的複雜過程實現;
遞歸實現階乘即是一個典型的函數式:
function factorial(n) { if (n == 0) return 1; return n * factorial(n-1); } console.log(factorial(3)); // 3 x 2 x 1 = 6
**.map() .reduce()**等 也是申明式編程函數;
函數合成
一個值變成另外一個值,中間通過多個函數,將多個函數合併爲一個函數來實現;
舉個例子:
// 高中數學常見的過程 g(x) = 2x; h(x) = x + 3; f(x) = 2x + 3; // 則可變換爲如下形式,即咱們所學的複合函數 f(x) = h(g(x));
上面的f(x)即是一個合成函數,實現了變量x到2x + 3的轉變;
js的實現:
function gFn(x) { return x *2; } function hFn(x) { return x + 3; } console.log(hFn(gFn(1))); // 5 // 使用函數合成 function fFn(x) { return hFn(gFn(x)); } console.log(fFn(1)); // 5
函數柯理化(Currying)
以邏輯學家***Haskell Curry***命名,即便接收多個參數的函數變成接受單個參數的函數的過程。單參數會使函數合成更簡單;
例如:
// 原函數 function plusFn(x, y, z) { return x + y + z; } console.log(plusFn(1, 2, 3)); // 6 // 柯理化後 function plusFn(x) { return function(y) { return function(z) { return x + y + z; } } } console.log(plusFn(1)(2)(3)); // 6
技術文章推送 手機、電腦實用軟件分享