Я не понимаю эту часть JavaScript по прототипу - PullRequest
0 голосов
/ 07 октября 2011

В настоящее время я работаю над Google Map API V3, используя cakephp с prototype.js. У меня есть класс JavaScript под названием: TravelMapprManager, и он имеет 4 переменные класса с 18 функциями.

var TravelMapprManager = Class.create( {

  // id of container
    map_container : '',

  /* the current map */
    map : null,

  /* geocoding location */
    geocoder : null,

   /* user entered locations */
     user_journey : new Array(),

  //many other functions [.....]

initialize : function( map_container ) {

    this.map_container = map_container;

    // start the map
    Event.observe( window, 'load', this.displayMap.bind(this) );

    // observe the map buttons
    Event.observe( document, 'dom:loaded', this.initObservers.bind(this) );

},

   /*
    * Save the location entered
    */
findLocation : function() {

    location_name = $( 'LocationName' ).value;


    if ( location_name == '' ) {
        alert( "Please enter a location name." );
        return;            
    }

    // we only allow a maximum number of locations
    if ( this.user_journey.length >= 20 ) {
        alert( "Sorry! We have reached the maximum number of locations." );
        return;
    }

    // Do geocoding, find the longitude and latitude of the location
    if ( this.geocoder ) {

        var current_o = this;

        this.geocoder.getLatLng(
            location_name,
            function( point ) {

                if ( !point ) {
                    alert( location_name + " not found" );
                } else {

                    // store the location
                    current_o.storeLocation( location_name, point );

                    // center the location on the map and add push pin marker
                    current_o.map.setCenter( point, 13 );
                    var marker = new GMarker( point );
                    current_o.map.addOverlay( marker );
                }
            }
            );
        }
    }
})

Что означает var current_o = this; в функции findLocation?

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

this внутренняя функция findLocation отличается от ключевого слова this во внутренней функции:

var current_o = this; //<-- Store reference to the `this` keyword inside the func
...
this.geocoder.getLatLng(
        location_name,
        function( point ) { //<------------ 
....

Сохраняя ключевое слово this во временной переменной, внутренняя функция может также получить доступ к свойствам this внутренней функции findLocation. <ч /> Простой пример Этот код добавляет прослушиватель событий к следующему элементу ввода, сохраняя при этом ссылку на предыдущий элемент:

var a = document.getElementsByTagName("input");
a[0].onclick = function(){
    var firstElement = this; //First `this`
    a[1].onclick= function(){
        firstElement.onclick = function(){}; //Reset
        this.onclick = function(){alert("This is different!")}; //Second `this`
    }
}

Ключевое слово this внутри прослушивателей событий относится к элементу, с которым они связаны. В этом примере первый this относится к элементу input[0], а второй this относится к input[1]. Если вы не сохраните первый this во временной переменной (firstElement), вы не сможете ссылаться на предыдущий this (без прямой ссылки на первый элемент с помощью document.getElements..).

2 голосов
/ 07 октября 2011

Это привязка this к локальной переменной, так что объект можно использовать внутри анонимной функции, которая передается в getLatLng.Это необходимо, потому что референт this может отличаться внутри этой функции - это зависит от того, как он вызывается внутри getLatLng.

...