柯理化
在JS中柯里化就是把一個需要傳入多個參數(shù)的函數(shù)變成多個嵌套的只要傳入一個參數(shù)的函數(shù)
在普通函數(shù)中的柯理化:
var add=function(x,y){
?return x+y;
}
柯里化:
var addCurring=function(x){
?return function(y){
? return x+y;
}
}
?
addCurring(1)(2);//3
?
如果是多個參數(shù)就會有多層嵌套,相當(dāng)于把一個函數(shù)拆分成多個部分,通過組合得到完整的函數(shù),其實柯里化和前端框架的組件思想相同,都是模塊化思想。
?
來一個四個參數(shù)的例子:
?
var add=function(a,b,c,d){
? console.log(a+b+c+d);
}
柯里化后:
var addCurring=function(a){
return function(b){
return function(c){
return function(d){
console.log(a+b+c+d);//這里寫的是邏輯代碼,我這里用打印代替
}
}
}
}
var addCurring1=addCurring(1);
var addCurring2=addCurring1(2);
var addCurring3=addCurring2(3);
var addCurring4=addCurring3(4);// 10
如果前面幾個參數(shù)都是固定的情況可以這樣解決:
var addCurring=addCurring(1)(2)(3);
//只需要傳入最后一個參數(shù)即可
addCurring(4);//10
addCurring(5);//11
addCurring(6);//12
?
高階函數(shù)中:
var currying = function(fn) {
????????????//這里保存每次的開銷
????????????var args = [];
????????????return function() {
????????????????//如果傳入的參數(shù)長度為0,也就是沒有傳參的情況下,其實就是告訴程序,我要/求總開銷了
????????????????if (arguments.length === 0) {
????????????????????//將fn在這塊上下文中執(zhí)行,并且把每天的開銷當(dāng)做參數(shù)傳入
????????????????????return fn.apply(this, args);
?
????????????????//有參數(shù)傳入的話,就說明還在記錄每天的開銷,并沒有要/求總開銷
????????????????} else {
????????????????????//arguments請自行g(shù)oogle,它是一個對象并不是一個數(shù)組。
????????????????????//將arguments轉(zhuǎn)為數(shù)組后push到args
????????????????????//也就是收到每天的開銷后,保存到args中
????????????????????[].push.apply(args, arguments);
????????????????????//把這塊上下文再次return出去
????????????????????return arguments.callee;
????????????????}
????????????}
????????};
????????var cost = (function() {
????????????//典型的閉包,將money保存起來
????????????var money = 0;
????????????//這里就是currying(fn)中的fn
????????????return function() {
????????????????//arguments其實就是currying中的args
????????????????//收到了求總開銷的命令,下面是真正計算總開銷的地方
????????????????for (var i = 0, l = arguments.length; i < l; i++) {
????????????????????money += arguments[i];
????????????????}
????????????????return money;
????????????}
????????})();
????????var cost = currying(cost); // 轉(zhuǎn)化成currying 函數(shù)
????????cost(100); // 未真正求值
????????cost(200); // 未真正求值
????????cost(300); // 未真正求值
????????cost(200); // 未真正求值
????????cost(200); // 未真正求值
????????cost(50); // 未真正求值
????????cost(100); // 未真正求值
????????alert(cost()); // 求值并輸出:600
?
?
總而言之,柯里化就是使用了功能化的思想來處理函數(shù)多個參數(shù)的情況,從而提高代碼的可閱讀性以及可維護性
?
轉(zhuǎn)載于:https://www.cnblogs.com/fyh123/p/5990020.html
總結(jié)
- 上一篇: Virtualbox桥接网卡设置
- 下一篇: nbu备份nas文件服务器,NBU备份恢