2013-05-29 65 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