es6和es5中的this指向
先看一段程式碼:
var name = "window";
var obj = {
name: 'obj',
//普通函式
one: function(){
console.log(this.name)
},
//箭頭函式
two: ()=> {
console.log(this.name)
},
//普通函式中的箭頭函式
three: function(){
(()=>{
console.log(this.name)
})()
},
//多層箭頭函式
four: ()=> {
(()=>{
console.log(this.name)
})()
}
}
obj.one(); //obj
obj.two(); //window
obj.three(); //obj
obj.four() //window
說明:
1、
①普通函式中的this總是指向它的直接呼叫者;
②箭頭函式中的this是在定義函式的時候繫結,而不是在執行函式的時候繫結。
2、
①比如上面的 obj.one();直接呼叫者是obj,因此this指向obj
②箭頭函式中的this指向是固定的,並不是因為箭頭函式內部有繫結this的機制,實際原因是箭頭函式內部沒有this,箭頭函式的this是在定義時就繫結的,它的this就是箭頭函式所處的物件的所處作用域。
比如obj.three();箭頭函式所在的物件是函式three,函式three處於obj的作用域中,因此this指向obj;
比如obj.four();箭頭函式所在的物件是obj,obj處於window的作用域中因此this指向window。
3、
es6函式寫法有2種,一種是 fn: (str) => { } ; 一種是 fn(str){ }
箭頭函式是沒有上下文的、this會直接指向上一級
第二種寫法this指向呼叫它的呼叫者