2013-03-03 4 views
0

Я пишу функцию в JS, но у меня есть проблема с переменным маркером.JavaScript scoping не присваивает переменную

Код:

function piano(numero, link) { 

      var marker; 
      this.marker = marker; 

      var immagine = loadImage(link, marker); 
      this.immagine = immagine 


      function createMarker() { 

        return new RichMarker({ 

          .... 

        }); 
      } 

      function loadImage(link, marker) { 

        var immagine = new Image(); 

        immagine.src = link; 

        immagine.onload = function() { 
          marker = createMarker(); 
        }; 

        return immagine; 
      } 

      .... 

variabile Immagine инициализируется вызовом функции LoadImage для загрузки изображения.

В этой функции это код:

    immagine.onload = function() { 
          marker = createMarker(); 
        }; 

, которые должны сделать назначение маркеров после загрузки изображения.

Когда я пытаюсь получить доступ к маркерам, после загрузки изображения, это всегда приводит к неопределенным; и я точно знаю, что был создан RichMarker.

Я не понимаю, почему это происходит.

+0

JavaScript переменные будут хранить ссылку на объект, но вы не можете поделиться ссылкой сказать ' Number' или 'String' или' undefined'. Если маркер - это что-то вроде массива или объекта, то «marker» и «this.marker» не будут тем же самым объектом при его изменении позже (что не определено, поэтому то, что вы делаете, не будет работать). – Chad

ответ

0

Переменные JavaScript будут хранить ссылку на объект, но вы не можете поделиться ссылкой, например: Number или String или undefined. Если ничего, кроме массива или объекта, то и this.marker не будут тем же самым объектом при его изменении позже (подумайте об этом как о копировании значения, а не о присвоении ссылки).

Вместо этого попробуйте обзорного в this объект, поэтому позже можно сослаться, что объект снова:

function piano(numero, link) { 
    var self = this; 
    this.immagine = loadImage(link); 


    function createMarker() { 
     return new RichMarker({ 
      //... 
     }); 
    } 

    function loadImage(link) { 
     var immagine = new Image(); 
     immagine.src = link; 

     immagine.onload = function() { 
      //use the scoped version of 'this' 
      self.marker = createMarker(); 
     }; 

     return immagine; 
    } 

    //... 
} 
Смежные вопросы