如何通过google.maps.event.addDomListener调用对象方法时访问对象成员变量

时间:2015-05-07 10:25:41

标签: javascript google-maps

我正在使用google-maps javascript v.3 API。我只是在这里展示了一个聪明的代码,我认为这是与我的问题相关的唯一部分。

我不明白为什么在调用gmaps.initMap时,对象GMaps的成员变量似乎消失了,如下所示google.maps.event.addDomListener(window, 'load', gmaps.initMap);

我已经实现了函数GMaps.test以查看成员变量GMaps.LATIDX是否被正确警告,这确实按预期工作。但是,当我尝试通过GMaps.initMap调用函数google.maps.event.addDomListener(window, 'load', gmaps.initMap);中的相同成员变量时,会发出“未定义”警报,我不明白为什么。

<!DOCTYPE html>
<html>
<head>

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>

var GMaps = function() {
    this.map = null;
    // constants
    this.LATIDX = 0; // 2d array index constant (latitude index)
    this.LNGIDX = 1; // 2d array index constant (longtitude index)

    this.test = function() {
        alert(this.LATIDX); // THIS ALERTS 0 AS EXPECTED
    }

    this.initMap = function(aActor, aLatLngCoord, aLatLngCenter) {
        alert(this.LATIDX); // THIS ALERTS "undefined", I DON'T UNDERSTAND WHY.
    }
 }
</script>

gmaps = new GMaps();
gmaps.test();
google.maps.event.addDomListener(window, 'load', gmaps.initMap);

</head>
</html>

1 个答案:

答案 0 :(得分:1)

当您使用addDomListener / addListener时,API将在应用了侦听器的对象的上下文中执行回调(在您的代码中为window),{{1将指向这个对象。

要更改上下文,请使用bind(或apply)并使用所需的对象(this)作为第一个参数:

gmaps

当函数是特定对象的方法时,就像在代码中一样,使用执行所需函数的回调(对象方法)就足够了,那么就不需要更改上下文了:

google.maps.event.addDomListener(window, 
                                 'load', 
                                 function(){
                                   gmaps.initMap.call(gmaps);
                                 });