- 不綁定arguments柴底,用rest參數(shù)…解決
- 本身沒有this的概念摇邦,捕獲其所在上下文的 this 值召烂,作為自己的 this 值
- 箭頭函數(shù)沒有原型屬性(prototype)
- 箭頭函數(shù)不能當做Generator函數(shù),不能使用yield關(guān)鍵字
- 箭頭函數(shù)不能換行
- 箭頭函數(shù)不能使用new(會報錯)
- 箭頭函數(shù)有constructor贡避、length屬性
- 箭頭函數(shù)可以立即執(zhí)行
下面一波栗子走起继准,讀者自己對號入座:
栗子一(請在瀏覽器環(huán)境下測試躬审,不要使用node)
const A = () => {
console.log(arguments)
}
A()
const B = (...args) => {
console.log(args)
}
B()
栗子二
var obj = {
age: 18,
a: function () {
console.log(this.age)//18
},
c: () => {
console.log(this)//window
console.log(this.age)//undefined
},
d: function () {
return () => {
console.log(this)//obj{}
console.log(this.age)//18
}
}
}
obj.a()
obj.c()
obj.d()()
obj.d().call({ age: 20 })//18
箭頭函數(shù)會捕獲其所在上下文的 this 值棘街,作為自己的 this 值蟆盐;
但是我覺得這條和上條其實是一條,還是捕獲所在的上下文遭殉,比如下面這個例子:c是一個箭頭函數(shù)石挂,然后它的 this是指向window,這是為什么呢险污,因為箭頭函數(shù)捕獲的是obj{}這個對象的環(huán)境痹愚,然后這個環(huán)境的this指向的是window,就相當于上一條的例子:在d方法里面return的那個箭頭函數(shù)捕獲的是c:function(){}這個環(huán)境的this蛔糯,而這個環(huán)境的this是obj拯腮。
栗子三
const C = (...args) => {
console.log(args)
}
C.call(null,1)//[ 1 ]
C.call(this,1)//[ 1 ]
C.call(1,1,2,3)//[ 1, 2, 3 ]
C.apply(1,[1,2,3])//[ 1, 2, 3 ]
console.log(C.prototype)//undefined
箭頭函數(shù)的this永遠指向其上下文的 this,任何方法都改變不了其指向蚁飒,如call(), bind(), apply(),比如栗子二中obj.d().call({ age: 20 })//18动壤,再來看稍微復(fù)雜的栗子:
var obj1 = {
age: 18,
a: function (add) {
return (() => add + this.age)();
},
b: function (add) {
var fn = v => v + this.age;
var o = { age: 20 }
return fn.call(o, add)
}
}
console.log(obj1.a(1))//19
console.log(obj1.b(1))//19
PS:
箭頭函數(shù)不能當做Generator函數(shù),不能使用yield關(guān)鍵字
箭頭函數(shù)不能換行SyntaxError: Unexpected token =>
普通函數(shù)的this指向調(diào)用它的那個對象