以前讀語言精粹的時候一直對函數的調用的理解是模模糊糊,只知其一;不知其二。尤爲是 函數調用模式
更是一頭霧水。終於今天讓我遇到這個問題了,總算是對函數調用模式
和this
有了一個相對來講比較清楚的認識。java
javascrit中的this有一個特性就是:運行期綁定(不包括箭頭函數),因此this能夠是 全局對象
,當前對象
或者 任意對象
,這徹底取決於函數的調用方式函數
以此模式調用函數時, this
會被綁定到全局對象。這是一個語言上的設計錯誤。舉個栗子:this
var Chat = { func1 () { //... this.func2() //這裏會報錯: func2 is not a function } func2 () { //... } }
出現這種錯誤的緣由就是,this
沒有綁定到Chat對象上,而是綁定到全局對象上了。致使,方法不能利用內部函數。設計
解決方法一:code
var Chat = { func1 () { //定義一個變量that賦值給this,那麼內部函數能夠經過that訪問到this var that = this this.func2() } func2 () { //... } }
解決方法二:對象
var Chat = { func1 (){ Chat.func2() //誰的方法,誰調用 } func2 () { //... } }
function taskA() { this.name = 'hello' var fn = function() { console.log(this) console.log(this.name) } var arrow_fn = () => { console.log(this) console.log(this.name) } fn() arrow_fn() } taskA()
首先根據 詞法做用域
,因爲它自己沒有this,因而便向上查找this
。接下來,發現taskA是有this的,因而便直接繼承了taskA的做用域。繼承
那麼,問題來了:taskA的this又是什麼呢?
taskA是一個普通函數,普通函數的this是在運行時決定的,因爲咱們是直接調用taskA的,即taskA(),因此其this即是window。因此,在這個例子中,arrow_fn中的this是window作用域
因此,綜上所述:箭頭函數中的this是定義的時候就決定的。另外,還須要注意的一點是:它的 this 指向是不可改變的it