參見 https://www.jianshu.com/p/051...
https://segmentfault.com/a/11...javascript
接下來仨
https://segmentfault.com/a/11...
箭頭函數
https://es6.ruanyifeng.com/#d...
https://segmentfault.com/a/11...java
如下主要記錄本身不太懂的地方,詳解見上述連接es6
箭頭函數有幾個使用注意點。segmentfault
(1)函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象。
(2)不能夠看成構造函數,也就是說,不可使用new命令,不然會拋出一個錯誤。
(3)不可使用arguments對象,該對象在函數體內不存在。若是要用,能夠用 rest 參數代替。
(4)不可使用yield命令,所以箭頭函數不能用做 Generator 函數。數組
箭頭函數根本沒有本身的this
,致使內部的this
指向了外層代碼的this
,這個指向在定義時就已經肯定而不會在調用時指向其執行環境的(變量)對象。除了this
,如下三個變量在箭頭函數之中也是不存在的,指向外層函數的對應變量:arguments
、super
、new.target
。app
因爲箭頭函數沒有本身的this
,因此固然也就不能用call()
、apply()
、bind()
這些方法去改變this
的指向。
函數
let getTempItem = id => ({ id: id, name: "Temp" });
const full = ({ first, last }) => first + ' ' + last; // 等同於 function full(person) { return person.first + ' ' + person.last; }
const numbers = (...nums) => nums; numbers(1, 2, 3, 4, 5) // [1,2,3,4,5] const headAndTail = (head, ...tail) => [head, tail]; headAndTail(1, 2, 3, 4, 5) // [1,[2,3,4,5]]
超時調用(setTimeout
回調)的代碼都是在全局做用域環境中執行的,所以(setTimeout
回調)函數中this
的值在非嚴格模式下指向window
對象,在嚴格模式下是undefined
this
不適用場合
第一個場合是定義對象的方法,且該方法內部包括this
。會指向全局變量,由於對象不構成單獨的做用域,致使箭頭函數
定義時的做用域就是全局做用域。spa
const cat = { lives: 9, jumps: () => { this.lives--; } }
第二個場合是須要動態this
的時候,也不該使用箭頭函數。rest
var button = document.getElementById('press'); button.addEventListener('click', () => { this.classList.toggle('on'); });
上面代碼運行時,點擊按鈕會報錯,由於button
的監聽函數是一個箭頭函數,致使裏面的this
就是全局對象。若是改爲普通函數,this
就會動態指向被點擊的按鈕對象。
嵌套的箭頭函數(沒看)