函式式程式設計(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 => )
我們之前已經模擬過foreach
、filter
,所以我們現在來模擬map
、every
、some
// 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 函式。事實上,...