對於很多初學者,this總是搞得我們暈頭轉向。
現在,我就簡單的總結一下關於this的那點事。
this在函式定義時經常是不能確定的,只有在函式執行的時候才能最終確定this的歸屬。this總是指向最後呼叫它的物件,那麼怎麼知道到底是誰呼叫的呢?其實很簡單,我們知道函式呼叫的其中一種方法就是利用call.下面就來簡單的分析一下怎麼利用call來判斷呼叫函式的物件到底是何方神聖。
先來看看call是怎麼來使用的:
fun.call(thisarg, arg1, arg2, ...)
thisarg:在fun函式執行時指定的this值。需要注意的是,指定的this值並不一定是該函式執行時真正的this值,如果這個函式處於非嚴格模式下,則指定為null和undefined的this值會自動指向全域性物件(瀏覽器中就是window物件),同時值為原始值(數字,字串,布林值)的this會指向該原始值的自動包裝物件。
arg1, arg2, …:指定的引數列表。
知道了call的用法,就可以開始this的分析之旅了。
例子1:
function test()
test();
test() 等價於 test.call(undefined) ,這時的thisarg為undefined,所以this指向全域性物件(瀏覽器中為window物件),所以this.name為undefined。
例子2:
var obj =
}; var test1 = obj.func();//tang
var test2 = obj.func;
obj.func(); //tang
test2(); //undefined
第8行 test1=obj.func(),賦值時執行函式,obj.func()等價於obj.func.call(obj),thisarg為obj,this指向obj,this.name為tang;
第10行obj.func() 等價於 obj.func.call(obj) ,這時的thisarg為obj,即this指向obj,所以this.name即為tang;
第11行test2()等價於test2.call(undefined),所以this指向全域性物件(瀏覽器中是window);
第8行和第9行的區別在於賦值的時候有沒有執行函式,第8行賦值的就執行函式,所以this指向obj,而第9行賦值時沒有執行函式,只是把函式賦值給test2,所以this的指向還得等呼叫函式時才能確定,在第11行呼叫函式時才能確定。
拓展的那點事
時間過得很快,又到了公司每年的拓展時間,今年公司拓展活動是安排在崇明島,因為時間關係自己有一些瑣事不能參加,至今心裡還有一絲的眷戀。拓展訓練不是簡單的娛樂和體育活動,它的中間融合了各種挑戰的元素,這些東西一般是在大學和工作中很難學到的,有時我們看了一些書就感覺自己知道和明白這些道理,但是遇到真真的事...
typedef的那點事
typedef struct node node,linklist 以上這段 幾乎在任何資料結構教材中都會出現,如此經典的一段 的理解還真是費了我一番功夫。之前學的是c 這種純正c風格的寫法幾乎沒有用到過。1.struct node 定義了乙個stuct node型別的結構體 c語言規定結構體型別為...
NSObject的那點事
nsobject的那點事 社群會員jameshudw對nsobject類做的總結,希望對各位有所幫助。文 cocoachina社群會員jameshudw 首先我們來看一下c語言中的struct的記憶體表示 typedef struct intstruct intstruct 結構體在記憶體中的表示為...