// 函数式编程思想
/**
- 把函数当成普通数据类型来看待,可以存放再数组里,当做参数传递,赋值给变量
*给函数起正确的变量
**/
const BlogController = {
index(posts) { return Views.index(posts); },
show(post) { return Views.show(post); },
create(attrs) { return Db.create(attrs); },
update(post, attrs) { return Db.update(post, attrs); },
destroy(post) { return Db.destroy(post); },
};
//优化
const BlogController1 = {
index: Views.index,
show: Views.show,
create: Db.create,
update: Db.update,
destroy: Db.destroy,
};
/*
- 纯函数,相同的输入,永远返回相同的输出,注意 数组和Json 对象的处理
- 建立缓存,优化性能
- 可移植性/自文档化
- 可测试性
- 合理性
*/
var memoize = function(f) {
var cache = {};
return function() {
var arg_str = JSON.stringify(arguments);
cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
return cache[arg_str];
};
};
/*
- 函数柯里化
- 通过函数返回函数,
- 可以缓存参数
- 高阶函数
*/
function curryMain(append) {
var arr = [];
return function reply() {
var arg = Array.prototype.slice.call(arguments);
arr = arr.concat(arg);
if (arg.length === 0) { // 递归结束条件,修改为 传入空参数
return append(arr);
} else {
return reply;
}
/*
- 函数组合,通过将多个纯函数进行拼接组合,从右到左或者从左到右,依次调用
*/
var compose = (...args) => x => args.reduceRight((value, item) => item(value), x);
/**
*/
简单例子
/** 刷新事件
* @param {Object} val 视图信息
* @returns {null} 无
*/
getRefreshData(val){
const refresh = (number) => {
return 1;
}
this.pageChange(val, refresh)
},
/** 向前翻页
* @param {Object} val 视图信息
* @returns {null} 无
*/
getPrePageData(val){
const getPre = (number) => {
return number - 1;
}
this.pageChange(val, getPre)
},
/** 向后翻页
* @param {Object} val 视图信息
* @returns {null} 无
*/
getNextPageData(val){
console.log(val)
const getNext = (number) => {
return number + 1;
}
this.pageChange(val, getNext)
},
/**基于页数变化函数,来进行检索
* @param {Object} val 视图信息
* @param {Function} fn 处理页数的函数
* @returns {null} 无
*/
pageChange(val, fn){
const { code } = val;
const num = this.manuScriptData.find(manuScript => manuScript.code == code);
num.pageData.currentPage = fn(num.pageData.currentPage);
this.searchManuScript(code, num.pageData.currentPage - 1);
},
----------------------------------------------------------------------
比如: 现在有个音乐播放器,要放歌 具体实现函数省略
var player = getplayer(); //找到播放者
var gedan = compose(getGedan(),player ) //找到歌单
var ge = compose(getGe(), gedan)//找到歌
var bofa = compose(getBofa(), ge) //播放歌
/*
- 声明式编程 通过函数组合,curry等高级函数,依次返回自己想要的结果,使得代码整洁
*/
// 声明式
var makes = cars.map(function(car){ return car.make; });
ENUM_NO1_TAG_GROUP_KEY.map(key => result[key])
.filter(Boolean)
.join()
尾递归优化
递归中返回函数,占用内存空间少
网友评论