1. 程式人生 > 實用技巧 >Js箭頭函式和lambda

Js箭頭函式和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中就是匿名函式。

資源搜尋網站大全 https://www.renrenfan.com.cn

箭頭函式使用總結:

  • 箭頭函式適合純函式的操作,比如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