2013-05-29 164 views
3

我有一些JavaScript代碼可以正常工作。但是,我覺得有點難以解釋它爲什麼會起作用。我希望有人能向我說清楚。 我有一個對象必須響應某些事件,例如點擊事件。對象的一部分是這樣的:此內部事件處理程序的JavaScript代碼說明

Maps.Marker = function (id, data, clickEvent) { 
    this.id = id; 
    this.data = data; 
    this.clicked = clickEvent; 
}; 

的對象是在谷歌地圖渲染,所以點擊地圖中的對象時,我想的泡沫事件到clickEvent。部分代碼如下所示:

if (marker.clicked) { // click handler defined 
google.maps.event.addListener(m, "click", function() { 
     marker.clicked(); 
}); 
} 

請注意我在這裏省略了很多代碼,以求簡潔,並且知道它在這裏粘貼看起來不正確。重要的是在Google Map事件偵聽器中調用marker.clicked()函數。

所以,當我的標記對象實例化時,它看起來是這樣的:

var objClicked = function() { 
if (this.data != null) {...} 
... 
} 
var obj = new Maps.Marker("1", { "some object data" }, objClicked); 

我不明白,完全是怎麼this.data居然在objClicked功能將工作(我可以訪問「一些?對象數據」 可有人請向我解釋

+0

重複:http://stackoverflow.com/questions/3127429/javascript-this-keyword –

+0

@ShadowCreeper:不是一個真正的副本,現在呢? – chrisbuchholz

+0

@chrisbuchholz我不確定。這一個更具體。所以也許不是。 –

回答

1

你調用這樣的功能:

marker.clicked(); 

由於參照的文ce函數來自於「marker」引用的對象的「clicked」屬性,該對象用於函數中的this值。這就是JavaScript的工作原理。

請注意,如果你做了一件奇怪的是這樣的:

var wrong = {}; 
    wrong.clicked = marker.clicked; 
    wrong.clicked(); 

那麼你的代碼是行不通的,因爲this要提到的是「錯誤」的對象。因此,一般情況下:如果一個對象有一個屬性,並且該屬性值是一個函數的引用,並且您通過該引用調用該函數,那麼該函數中的this將引用該對象。該綁定發生在每個單獨的函數調用上;功能和對象之間沒有永久的關係。 (你可以得到的東西,如.bind()永久關係效果

+0

感謝您的快速響應。你說「這就是JavaScript的工作原理」。你可以爲這個範圍添加一些特定的術語或...?或者甚至可能是解釋此功能的鏈接? – user1632306

+0

@ user1632306它不是「範圍」。 [這是函數調用如何工作的規範。](http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.3)在第6步中看到有關設置* thisValue *的內容? (不幸的是,ECMA規範很難閱讀和混淆。) – Pointy

+0

謝謝 - 很好的答案。只是想確保它與封閉無關,而我錯過了。 – user1632306

3

原因在於在JavaScript中this關鍵字的方式。當您將一個函數分配給某個對象內的某個屬性並稍後調用此函數marker.clicked()時,該函數內部的this將設置爲圓點左側的任何值,在本例中爲。

UPDATE

這裏有一個更透徹的解釋:http://www.impressivewebs.com/javascript-this-different-contexts/

+0

+1的鏈接 –

+0

這裏是我更喜歡的鏈接:http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/ –

+0

@ShadowCreeper:真的很棒! – chrisbuchholz