在普通函數中的this:
this的值是在執行的時候才能確認,定義的時候不能確認!爲什麼呢 —— 因爲this是執行上下文環境的一部分,而執行上下文需要在代碼執行之前確定,而不是定義的時候。
1、this總是代表它的直接調用者,比如:obj.fun,那麼fun中的this是obj
2、如果沒有直接調用者,默認情況下(非嚴格模式)this爲window對象
3、嚴格模式中('use strict'),this爲undefined
TIPS:可以使用call、apply、bind改變this的指向。
ES6中的this:
箭頭函數沒有自己的this,它的this就是定義箭頭函數時this的指向,即繼承父級的this,這個父級是什麼意思呢?
先來理解作用域,在JS中,每一個函數有自己的作用域,創建一個函數時,就會創建一個“上下文對象”,在函數中我們是可以聲明另一個函數的,這個函數也會有自己的上下文對象,它與父級以及祖先級的上下文對象形成了作用域鏈,可以簡單的理解作用域鏈就是所有“上下文對象”串聯起來的鏈條,而這個父級就是指箭頭函數所在作用域鏈上的上一個“上下文對象”,有點繞口,通過一個例子來說明:
TIPS:關於作用域請查看js之作用域和內存問題
var a=100;
var b = {
a:1000,
b:{
a:1,
c:{
a:22,
getA:()=>{
console.log(this.a);
}
}
}
}
執行b.b.c.getA();
最後執行的結果是100,爲什麼呢,因爲執行getA時,作用域鏈中的第一個對象是getA函數本身的上下文對象,上一層對象就是頂層的window對象的上下文對象,它的this是指向window的。
再來看一個例子:
var a=100;
var b = {
a:1000,
b:{
a:1,
c:{
a:22,
getA:()=>{
console.log(this.a);
}
},
d:function(){
return {
getA:()=>{
console.log(this.a);
}
}
}
}
}
執行b.b.d().getA();
最後結果爲1。
此時的作用域鏈爲getA -> d -> window,getA爲箭頭函數,因此它的this指向的就是作用域鏈中的d函數,而d函數中的this指向的是b.b對象,因此this.a就是b.b.a,所以結果爲1