函式式程式設計與閉包

2021-10-24 10:59:39 字數 3443 閱讀 4667

函式式程式設計(functional programming,fp) fp是程式設計正規化之一,他和物件導向程式設計是並列的關係,函式式程式設計我們可以認為是一種思維的方法,加上他的實現方法,我們常聽說的程式設計正規化還有面向過程程式設計、物件導向程式設計。

面向過程其實就是現實世界的處理方式,一步一步的按照步驟來實現

// 非函式式 --- 面向過程程式設計方式

let num1 = 2

let num2 = 3

let sum = num1 + num2

console.log(sum)

// 函式式

function add (n1, n2)

let sum = add(2,3)

console.log(sum)

從**我們可以看出函式式程式設計提高了我們的**重用性,而且在我們的程式設計中,將多個函式組合在一塊可以組合出乙個功能更強大的函式,這是非函式式程式設計所欠缺的

mdn first-class function (在以下三點解釋)

* 函式可以儲存在變數中

* 函式作為引數

* 函式作為返回值

在js中函式就是乙個普通的物件(可以通過new function()),我們可以把函式儲存到變數/陣列中,它還可以作為另乙個函式的引數和返回值,甚至我們可以在程式執行的時候通過new function(『alert(1)』)來構造乙個新的函式。

// 把函式賦值給變數

let fn = function();

fn();

// 乙個示例

const blogcontroller = ,

show (post) ,

create (attrs) ,

update (post, attrs) ,

destroy (post) ,

}// 如果我們將來遇到乙個函式包裹乙個函式,而且它的形式也相同時,我們可以認為,這是兩個一樣的函式,那我們就可以把這段**進行一點精簡,我們可以看到index和其內部的views.index是一樣的,所以我們可以把views.index賦值給index,注意,我們是將乙個方法或者函式賦值給另乙個方法,不是把函式的呼叫賦值給另乙個方法

// 當我們改造完成後,**量將減少很多,功能也完全一樣,這裡我們就用到了將乙個函式或者方法賦值給另乙個函式或者方法

// 優化

const blogcontroller =

函式作為引數

// 高階函式---函式作為引數

// foreach

function foreach (array,fn)

};// filter

function filter (array,fn)

}return results;

};

函式作為引數的好處

函式作為返回值

// 高階函式---函式作為返回值

function fn();

};// 呼叫方式一

let func = fn();

func();

// 呼叫方式二

fn()();

// 實際案例:只執行一次的函式

function once(fn);

};};let on = once(function(x)次`);

});

對運算過程進行抽象,也就是把運算過程抽象成函式,然後在任何地方都可以去重用這些函式

//遍歷乙個陣列

//面相過程的方式

let array = [1,2,3,4]

for(let i = 0; i < array.lenth; i++)

//高階函式

let array = [1,2,3,4]

foreach(array, item=>)

let r = filter(array,item => )

我們之前已經模擬過foreachfilter,所以我們現在來模擬mapeverysome

// map --- 陣列中的乙個方法,對陣列中的每乙個元素進行遍歷,並對每乙個元素進行乙個處理,並對處理後的結果儲存到乙個新陣列中然後返回

const map = (array,fn) =>

return results

};let arr = [1,2,3,4];

arr = map(arr,v => v * v );

console.log(arr);

// every --- 遍歷陣列中的每乙個元素,並對其做乙個判斷,其中有乙個是false,其返回值就是false

const every = (array, fn) =>

};return results;

};let arr = [1,2,3,4];

let a = every(arr,v => v > 0);

console.log(a);

// some --- 遍歷陣列中的沒乙個元素,並對其做乙個判斷,其中有乙個是true,其返回值就是true

const some = (array,fn) => ;

};return results;

};let arr = [1,2,3,4];

let a = some(arr,v => v % 2 === 0);

console.log(a);

其實閉包就是乙個可以獲取到其他函式內部變數的函式,他必須要滿足三個條件才能被稱之為閉包

示例

function fn();

};let func = fn();

func();

function once(fn);

};};let on = once(function(x)次`);

});on(1);

// 案例一

function makepow(pow)

}// 求x次方

let pow2 = makepow(2);

let pow3 = makepow(3);

// 求值

console.log(pow2(3));

console.log(pow2(4));

console.log(pow3(3));

// 案例二

function wage(basic)

};let twelve = wage(12000);

let fifteen = wage(15000);

console.log(`王二工資$rmb`);

console.log(`張三工資$rmb`);

函式式程式設計 閉包

def curve pie a 25 defcurve x return a pow x,2 return curve f curve pie print f 2 輸出結果 ans 100 檢驗函式是否閉包 print f.closure 環境變數 a 25 print f.closure 0 ce...

Python函式式程式設計之閉包

def div fun n def div check fun x return x n 0 return div check fun這是什麼?外層函式中巢狀了乙個函式,然後外層函式將內層函式作為返回值進行返回,同時,返回函式中的計算也擁有了外層函式的變數n,這種將外部函式的引數和自身的區域性變數儲...

Scala函式式程式設計(六) 閉包

john d.cook 給物件和閉包 closure 下過乙個經典的定義 anobject is data with functions.a closure is a function with data 1 可以看到,閉包是由函式和執行時的資料決定的,閉包也因此被稱為 lambda 函式。事實上,...