函数式编程笔记
2019-07-24 本文已影响0人
fish_yijinc
函数式编程笔记
函数是一等公民
函数是 一等公民 实际上说的是它们和其他对象都一样,你可以像对待任何其他数据类型一样对待它们——把它们存在数组里,当作参数传递,赋值给变量...等等
用一个函数把另一个函数包起来,再调用执行,真的是非常糟糕的编程习惯。然而,到处都充斥着这样糟糕的代码
ajax(response => callback(response))
// 等价于
ajax(callback)
onClick = () => { handleClick() }
// 等价于
onClick = handleClick
setTimeout(() => { doSomething() }, 3000)
// 等价于
setTimeout(doSomething, 3000)
renderItem = item => { doRenderItem(item) }
// 等价于
renderItem = doRenderItem
我们来看看为何要推荐函数作为一等公民写法
const callback = json => { use(json) };
// 方式一
ajax('list/2', json => callback(json));
// 等价于 方式二
ajax(callback);
显然 方式一 只是徒增代码量,这时,如果callback需要添加一个参数,那么包裹它的那个函数也要做相应的变更。
添加 err 参数
const callback = (err, json) => { };
// 方式一 跟着添加 err 参数
ajax('list/2', (err, json) => callback(err, json));
// 方式二 // 一等公民函数的形式,不需要做任何修改
ajax(callback);
一等公民的方式被调用 ,很多时候 我们需要小心 this 指向
const handle = () => { console.log(this) }
//
onClick = handle.bind(this)
纯函数
纯函数是相同的输入,必定得到相同的输出,即它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。且该函数不会产生任何可观察的副作用。
看个例子
// 不纯的
var max = 100;
var isValid = function(num) {
return num <= max;
};
// 纯的
var isValid = function(num) {
var max = 100;
return num <= max;
};
在不纯的版本中,isValid 的结果将取决于 外部 max 这个可变变量的值。输入值之外的 max能够左右 isValid 的返回值,使用纯函数的形式,函数就能做到自给自足
纯函数就像数学上的函数,是一种输入到输出的映射,且y的值总是能由 x 唯一确定
副作用可能包含:
- 更改文件系统
- 往数据库插入记录
- 发送一个 http 请求
- 可变数据
- 打印/log
- 获取用户输入
- DOM 查询
- 访问系统状态
使用纯函数的好处有:
可缓存:在计算量大的函数中,实现缓存的一种典型方式是 memoize 技术
可测试: