對於this的指向問題還是有點不太清除,這里做一下整理,方便以后查看
普通函數的this
1.普通函數的this指向的是它的調用者,誰調用這個this,,this就指向誰,比如obj,fn,這里fn最外層的this就指向obj
2.如果沒有調用者,那這個this就指向window
3.在嚴格模式下(設置“use strict”),this為undefined
4.我們可以使用call,apply,bind(ES5新增)去改變普通函數的this指向
注釋:
1.call方法第一個參數是要改變的this指向,后面傳入的是一個參數列表。當第一個參數為null或undefined的時候,默認指向window,比如test.call(this,"one","two","three")
2.applyf方法接收兩個參數,第一個參數和call一樣,是this的指向,第二個參數一般是一個數組,當第一個參數為null或undefined的時候,默認指向window,比如:test.apply(this,["one","two","three"])
3.bind方法和call方法類似,第一個參數都是this的指向,從第二個參數開始接收參數列表。區別在於call和apply會改變this指向,然后執行函數,bind改變this的指向后,返回一個綁定的新的this函數。
箭頭函數的this
1.箭頭函數是ES6新增的,通俗的講,它指向的是外層的this,如果外層仍為箭頭函數,則再指向外層,也就是說箭頭函數的this指向箭頭函數外面第一個不是箭頭函數的那個函數的this。
2.call,apply,bind等方法也不能改變箭頭函數this的指向
下面是實例:
1.
xixi是全局函數,普通函數沒有人調用this的時候,指向window
2.
使用了嚴格模式后this為undefined
3.
第一個this指向obj,而setTimeout里面的匿名函數沒有直接調用者,this指向window
4.
如果我把setTimeout里面的普通函數,改成箭頭函數,里面的this就指向它外層的this,就是obj