资讯专栏INFORMATION COLUMN

Javascript箭头函数和lambda

paraller / 874人阅读

摘要:总结从上面的过程可以看出来,有两个主要的关键过程箭头函数是一个匿名函数,简化书写箭头函数作为变量传递给函数的回调所以箭头函数在很大程度上,简化了函数式的操作。其实表达式,在中就是匿名函数。

() => {} 基本特点

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
参考文档:

lambda和箭头函数

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106651.html

相关文章

  • 漫谈javascript函数式编程

    摘要:高阶函数不是的所特有的,其他编程语言也有。高阶函数面向切面编程面向切面编程这种思想在开发中比较常见,主要就是将一些与核心业务无关的功能抽离出来,比如异常处理,日志统计等。 javascript的函数式语言特性 我们知道JavaScript使一门面向对象的编程语言,但这门语言同时拥有很多函数式语言的特性。 JavaScript的设计者在设计最初就参考了LISP方言之一的Scheme,引入...

    liaorio 评论0 收藏0
  • 常见的JavaScript“陷阱”

    摘要:随着标准的普及,已经拥有许多新的语法糖,这让我们编写可读的,高质量的代码变得更加方便,但即使这样仍然会遇到一些潜在的陷阱。例如集合的最终长度是,由于两次添加的数组不是同一个。最终会得到大小为的集合,因为字符串是不可变。 showImg(https://segmentfault.com/img/remote/1460000019006033); 随着ES6标准的普及,JavaScript...

    greatwhole 评论0 收藏0
  • ES6函数Lambda演算

    摘要:高阶函数函数式编程中,接受函数作为参数,或者返回一个函数作为结果的函数通常就被称为高阶函数。均属于高阶函数,高阶函数并不神秘,我们日常编程也会用到。参考演算函数式编程指南入门康托尔哥德尔图灵永恒的金色对角线原文函数与演算 缘起 造了一个轮子,根据GitHub项目地址,生成项目目录树,直观的展现项目结构,以便于介绍项目。欢迎Star。 repository-tree 技术栈: ES6 ...

    fasss 评论0 收藏0
  • 每个 JavaScript 工程师都应当知道的 10 个面试题

    摘要:所支持的面向对象编程包括原型继承。发明于年的就是首批支持函数式编程的语言之一,而演算则可以说是孕育了这门语言。即使在今天,这个家族的编程语言应用范围依然很广。 1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么? JavaScript 是一门多范式(multi-paradigm)的编程语言,它既支持命令式(imperative)/面向过程(procedural)编程...

    jone5679 评论0 收藏0
  • 每个 JavaScript 工程师都应当知道的 10 个面试题

    摘要:所支持的面向对象编程包括原型继承。发明于年的就是首批支持函数式编程的语言之一,而演算则可以说是孕育了这门语言。即使在今天,这个家族的编程语言应用范围依然很广。 1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么? JavaScript 是一门多范式(multi-paradigm)的编程语言,它既支持命令式(imperative)/面向过程(procedural)编程...

    YorkChen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<