首先,我先拋出一個定論:」在Javascript中,This關鍵字永遠指向函數(方法)的擁有者」。
函數
alert("Hello, I am Laruencern");
}對於這個函數,this指向誰呢?
如我之前的文章所述(Javascript作用域),定義在全域的函數,函數的擁有者就是目前頁面,也就是window物件。
程式碼如下: 程式碼如下:
答案是肯定的,如果呼叫introduce函數,你就會認識我是Laruence。
也許,對於this關鍵字的迷惑,絕大部分原因是來自把函數(方法)用在事件處理的時候。
複製程式碼
我們知道,在JS中一切都是對象,函數和方法也都是對象的屬性,只不過函數有可執行的內部屬性。所以,對於上面的程式碼,在對onclick綁定處理器的時候, 其實是對id為name的輸入框Dom物件的onclick屬性賦值。
恩,因為這時候,不是賦值,而是引用。
如果我們注意倆種onclick的寫法,你會發現,對於之前的方法,我們使用的是:
dom.onclick = showvalue; //沒有呼叫符
而對於剛才的方法:
onclick = "showvalue()" //有呼叫符
這個也能側面的反映出倆者的區別:對於前者,是賦值,而對於後者是引用。如果我們這個時候查看輸入框的onclick屬性,我們得到:
alert(dom.onclick);
看到差別了麼?也就懂得為什麼了吧?
講到這裡,有一個很有趣的例子,大家可以在IE下試試:
改變this的指向
那,既然我們已經知道為什麼了,那怎麼才能讓this指向我們想要指的地方呢?
對於上面的事件處理函數來說,我們可以有以下幾種寫法:
dom.onclick = showValue();
dom.onclick = function() { alert(this.value) ;}
//想想剛才我們的引用,是如何嵌入這句的.
dom.addEventListener(dom, showValue, false); //ff only
而對於不是事件處理函數的場合,我們可以使用apply,或是call,來改變this關鍵字的指向。
例如:
;
;function introduce() {
}