參數(shù)this在面向?qū)ο缶幊痰臅r候非常重要沼沈,它的值取決于調(diào)用的模式瀑凝。
在JavaScript中永票,一共有4中調(diào)用模式浪默,方法調(diào)用模式喉童,函數(shù)調(diào)用模式者填,構(gòu)造器調(diào)用模式(new)和apply調(diào)用模式(apply忌堂,call证舟,bind)颂暇,這些構(gòu)造模式在如何初始化關(guān)鍵參數(shù)上存在差異缺谴。
方法調(diào)用模式
當(dāng)一個函數(shù)被保存為對象的一個屬性時,我們稱它為該對象的一個方法蟀架。當(dāng)我們調(diào)用該方法時瓣赂,this被綁定到該對象上。
調(diào)用方法的方式通常是使用點表達式(.)或者方括號下標表達式([])片拍。如:
函數(shù)調(diào)用模式
當(dāng)一個函數(shù)并非一個對象的屬性時煌集,它就是被當(dāng)做一個函數(shù)來調(diào)用的。
在函數(shù)調(diào)用模式下捌省,this被綁定在全局對象上苫纤。在《JavaScript語言精粹》中,被指出這是一種語言設(shè)計上的錯誤纲缓。如果正常卷拘,在內(nèi)部函數(shù)引用this,應(yīng)該被綁定在它的外部函數(shù)上而不是全局對象祝高。如:
所以栗弟,解決這個問題的方法是在外部函數(shù)把this保存起來,在內(nèi)部函數(shù)中使用工闺。如:
構(gòu)造器調(diào)用模式
如果在一個函數(shù)前加上new關(guān)鍵字乍赫,那么將會創(chuàng)建一個直接連接到該函數(shù)的prototype成員的新對象瓣蛀,并且將this綁定到新對象上。
apply調(diào)用模式(apply雷厂,call惋增,bind)
因為JavaScript是一門函數(shù)式的面向?qū)ο缶幊陶Z言,所以函數(shù)可以擁有方法改鲫。
而apply诈皿,call,bind都可以用來改變this的指向像棘,所以理所應(yīng)答可以綁定this對象稽亏。這里就不展開了。