关于javascript:函数式编程

58次阅读

共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。

1. 把函数赋值给变量

const controller = {

index(props){return View.index(props)}

}
等价于
const controller ={

index:View.index

}
2. 高阶函数

能够把函数作为参数传递给另一个函数:
function filter(array,fn){let results = [];
for(let i = 0;i<array.length;i++){if(fn(array[i])){results.push(array[i])
    }
}
return results;

}

能够把函数作为另一个函数的返回后果:
function once(fn){
let done = false;
return function(){if(!done){
        done = true;
        return fn.apply(this,arguments);
    }

}

}

let pay = function(money){console.log(money);

}

let pays = once(pay)
pays(333);
pays(222);

闭包

纯函数:对雷同的输出始终失去雷同的输入
纯函数的益处
1. 可缓存。因为雷同的输出始终都有雷同的输入,所以能够把纯函数的后果缓存起来

function getArea(r){

console.log('执行')
return Math.PI*r*r;

}
function memorize(func){

let resh = {};
return function(){let key = JSON.stringify(arguments);
    resh[key]=resh[key]||func.apply(func,arguments);
    return resh[key];
}

}
const getMemoryArea = memorize(getArea);
console.log(getMemoryArea(4));
console.log(getMemoryArea(5));
2. 可测试
3. 并行处理

副作用:副作用让一个函数变得不纯:如

let age = 18;
function checkage(nums){return age<=nums

}

如果函数依赖于内部的状态就无奈保障输入雷同,就会带来副作用
副作用的起源:配置文件,数据库,获取用户的输出

革新:
function checkage(nums){

  let age = 18;
return age<=nums;
                  

}
问题:存在硬编码问题

柯里化:解决下面硬编码的问题
简略的革新:
function checkage(nums,age){

return age<=nums

}
然而会造成 nums 的反复
checkage(20,24)
checkage(21,24)

柯里化革新:
function checkage(age){

return function(nums){return age<=nums}

}
let check19 = checkage(19);
check19(20);

柯里化:
1. 当一个函数有多个参数的时候先传递一部分参数调用他(这部分参数当前永远不变)
2. 而后返回一个新的函数承受残余参数,返回后果
3. 实现

function add(a,b,c){return a+b+c;}
const curry = (fn)=>{console.log(fn.length)
    return function curried(...args){if(args.length<fn.length){return (...res)=>{return curried(...args.concat(res))
            }
        }
        return fn(...args)
    }
}
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3));

函数组合,lodash 中的 fp 模块

// 把一个字符串中首字母提取并转换成大写,应用. 作为分隔符
// world wild web ===>W. W. W
const fp = require('lodash/fp');
// const firstLetterToUpper = fp.flowRight(fp.join('.'),fp.map(fp.first),fp.map(fp.toUpper),fp.split(' '))
const firstLetterToUpper = fp.flowRight(fp.join('.'),fp.map(fp.flowRight(fp.first,fp.toUpper)),fp.split(' '))

console.log(firstLetterToUpper('word wild web'));

正文完
 0