函數作為React組件的方法時, 箭頭函數和普通函數的區別是什麼?

// React

class Foo extends React.Component{
a(){
console.log(1)
}

a=()=&>{
console.log(1)
}

}

這兩種有什麼區別


很顯然第一個寫法是非法的。題目標籤裡面有 React, 所以且認為這段代碼是題主在 React 組件(ES6 Class)中截取出來的一部分。

首先是希望題主(以及眾多的其他題主)注意提問姿勢,不要惜墨如金藏頭藏尾,叫別人去猜你要問什麼。

那麼這個問題的完整描述應該是:

class App extends Component {
a() {
console.log(1)
}

a = () =&> {
console.log(1)
}
}

裡面的兩個 a 的定義有什麼區別?

第一個 a 不必說,是原型方法的定義。寬鬆模式下對應 ES5 就是

App.prototype.a = function() {}

第二個是 Stage 2 Public Class Fields 裡面的寫法,babel 下需要用 Class properties transform Plugin 進行轉義。相當於:

class App extends Component {
constructor (...args) {
super(...args)
this.a = () =&> {
console.log(1)
}
}
}

為什麼需要第二種寫法?

在 React 裡面,要將類的原型方法通過 props 傳給子組件,傳統寫法需要 bind(this),否則方法執行時 this 會找不到:

&

如何實現 Babel 編譯器?
使用ES6 Module如何處理模塊按需載入 (lazyload)?
瀏覽器直接支持ES6了,還需要編譯么?

TAG:JavaScript | ECMAScript2015 | React | ReactNative |