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'));
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。