Javascript箭头函数和lambda
() => {} 基本特点
es6中的箭头函数,在实际开发中确实比较方便,通常来说会有几个特点:
- 箭头函数中的this会绑定在外部作用域
- 没有arguments
- 如果想返回一个对象记得加()包裹
- call和apply不能传入this
(() => {a: 1})() //返回值为undefiend,想返回对象,使用下面的方式 (() => ({a: 1})()
箭头函数和lambda表达
lambda在计算机科学中表示匿名函数,本质上是用来简化操作的。简单来说,是一种表示方法,代表了一定的输入和输出。
step1:
实现一个平方运算表达(x * x):
数学表达式(λ代表一个表达式的输入):
λx.x * x
用JavaScript实现:
(function (x) { return x * x; })()
step2:
在平方的基础上再加2(x * x + 2):
数学表达式:
(λx.x * x)(λx.x + 2)
用Javascript实现:
(function(x) { return x + x })((function () { return x * x })())
其实就是利用了匿名函数然后,再继续嵌套。
但是有了箭头函数,就可以更加简便地实现上面的操作:
(x => x + 2)((x => x * x)())
step3:
更加优雅地实现,其实向上面这种方式,不是特别优雅,可读性不好,需要一种能够更加优雅地方式:
上面的行为抽象出来就是:前一个的输出作为后一个函数的输入,应该怎么实现呢?Javascript中提供了reduce这一个方法。
const action = [ x => x * x, x => x + 2 ]; let res = action.reduce((res, cur) => cur(res), 2);
step4:
总结:从上面的过程可以看出来,有两个主要的关键过程:
- 1、箭头函数是一个匿名函数,简化书写
- 2、箭头函数作为变量传递给reduce函数的回调
所以箭头函数在很大程度上,简化了函数式的操作。其实lambda表达式,在Javascript中就是匿名函数。
箭头函数使用总结:
- 箭头函数适合纯函数的操作,比如map、filter、reduce等操作
- 箭头函数内部,一般不要使用this,因为this是和外部作用域绑定的,容易产生问题
问题1:
function A() { this.foo = 1 } A.prototype.bar = () => console.log(this.foo) let a = new A() a.bar() //undefined
因为对象a,并没有构成一个作用域。
如果想让this指向A,可以这样写:
function A() { this.foo = 1; this.bar = () => { console.log('value', this.foo); } } let a = new A(); a.bar(); //1
因为bar的声明在函数A的作用域内部。
问题2:
const A = { foo: 1, bar: () => { console.log('value', this.foo); } } let a = Object.create(A); a.bar(); //undefined
如果想输出正常的值,应该使用function定义:
const A = { foo: 1, bar: function (){ console.log('value', this.foo); } } let a = Object.create(A); a.bar(); // value 1
参考文档:
相关推荐
meylovezn 2020-09-21
mmmjyjy 2020-07-16
typhoonpython 2020-06-11
x青年欢乐多 2020-06-06
Stranger 2020-05-16
PythonMaker 2020-04-22
QianYanDai 2020-04-18
千锋 2020-04-11
SDUTACM 2020-03-05
fly00love 2020-03-05
f = lambda x, y, z: x + y + z # returns a function that can optionally be assigned a name. def func:
sschencn 2020-02-21
wklken的笔记 2020-01-30
GhostLWB 2020-01-30
sulindong0 2020-01-19
chinademon 2020-01-12
mieleizhi0 2020-01-11