普通函數:
1、this總是代表着他的直接調用者,例如obj.fun(),那麼fun()中的this就是obj;
2、調用的時候,沒有任何前綴,則指向window,new的時候,指向new出來的對象;
3、在默認情況下(非嚴格模式),沒找到直接調動者,則this指向window;
4、在嚴格模式下,沒有直接調用者的函數中的this是undefined;
5、使用call、apply、bind綁定的,this指向綁定的對象。
箭頭函數:
1、this對象,就是定義時所在的對象,而不是使用時所在的對象;!!!
2、不可以當做構造函數,即不能使用new;
3、不可以使用arguments對象,該對象在函數體內不存在,如果要用可以rest參數替代;
4、不可以使用yield命令,因此箭頭函數不能使用Generator函數;
5、返回對象時必須在對象外面加上括號。
上面四點,第一個尤爲注意。普通函數this指向可變,但是箭頭函數是固定的。
看一個不太好理解的字面量對象中的this
var obj = {
num: 2,
fun1() { return this.num*2 },
fun2: ()=> { return this.num*5 }
}
obj.fun1() //4,this指向fun1的調用者obj
obj.fun2() // NaN,fun2定義的環境是window
obj.fun2() // NaN,fun2定義的環境是window
上圖,看結果