函数式编程笔记

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 唯一确定
y = f(x)

副作用可能包含:

使用纯函数的好处有:
可缓存:在计算量大的函数中,实现缓存的一种典型方式是 memoize 技术
可测试:

上一篇 下一篇

猜你喜欢

热点阅读