вопрос базового понимания: предметная область - PullRequest
3 голосов
/ 14 апреля 2011

когда я создаю экземпляр объекта ( simplegallery ) в обычной функции, подобной этой:

function setGallery(imgs){
    var galleryArray = new Array();
    for(var i=0; i<imgs.length; i++){
        galleryArray.push([imgs[i].imgpath + imgs[i].imghash + imgs[i].thumb + '.' + imgs[i].ext, "", "", ""]);
    }

    var mygallery=new simpleGallery({
        navpanelheight: 40,
        wrapperid: "fbImg", //ID of main gallery container,
        dimensions: [80, 60], //width/height of gallery in pixels. Should reflect dimensions of the images exactly
        imagearray: galleryArray,
        autoplay: [false, 2500, 2], //[auto_play_boolean, delay_btw_slide_millisec, cycles_before_stopping_int]
        persist: false, //remember last viewed slide and recall within same session?
        fadeduration: 500, //transition duration (milliseconds)
        oninit:function(){ //event that fires when gallery has initialized/ ready to run
            //Keyword "this": references current gallery instance (ie: try this.navigate("play/pause"))
        },
        onslide:function(curslide, i){ //event that fires after each slide is shown
            //Keyword "this": references current gallery instance
            //curslide: returns DOM reference to current slide's DIV (ie: try alert(curslide.innerHTML)
            //i: integer reflecting current image within collection being shown (0=1st image, 1=2nd etc)
        }
    });
}

Насколько я понимаю, созданный объект "mygallery" является экземпляром "simpleGallery". Поскольку объект "mygallery" объявлен в функции setGallery, это локальный объект, который будет потерян после завершения функции. Но simpleGallery связывает события, которые взаимодействуют с настройками, которые являются свойствами simpleGallery ... почему эти свойства остаются живыми, когда эти события запускаются?

Однако, как долго живет такой экземпляр и почему?

  1. Вопрос: Как я могу получить доступ к свойству этого экземпляра из другой функции, кроме setGallery? Например, когда я хочу получить значение mygallery.setting.imagearray.length ...

Спасибо, что помогли мне понять! : -)

Ответы [ 3 ]

3 голосов
/ 14 апреля 2011

В этом случае локальная переменная не уничтожается после завершения функции, потому что simpleGallery устанавливает события связывания в DOM, я полагаю. Вы видите, если javascript видит, что на некоторые объекты ссылается что-то за пределами, это удерживает их в памяти.
Этот объект будет находиться в памяти до конца программы или все ссылки будут очищены.
Чтобы получить imagearray.length, вам нужно запустить какое-то событие в области видимости объекта. Чтобы достичь этого, вам нужно изменить класс simpleGallery для установки события и функцию обратного вызова для запуска в диапазоне this
Если вы добавите приведенный ниже пример в конструктор simpleGallery, тогда событие onclick для domElement вызовет функцию someYourFunction в области действия экземпляра simpleGallery. Так что в этой функции у вас будет доступ к this.imagearray.length

var self=this;
domElement.addEventListener(
  "click",
  function(event) {someYourFunction.apply(self, event)},
  false);
2 голосов
/ 14 апреля 2011

Javascript имеет область действия функции, все переменные внутри функции (объявляется с помощью var) видны только в любом месте функция.

Функция является объектом , и время жизни этого объекта не обязательно заканчивается, когда вы покидаете тело функции. Например setGallery будет «жить», потому что mygallery продолжает «жить», но доступ к mygallery потерян (я уверен, что будет много предложения решений в других постах).

1 голос
/ 14 апреля 2011
Параметр

является публичной частью simpleGallery, поэтому вы можете получить доступ к настройке его объекта.Теперь вам нужно управлять объектом simpleGallery (myGallary), чтобы получить доступ к настройкам. Возможны следующие варианты:

1) Вернуть объект mygallery из setGallery, после чего вы можете вызвать его следующим образом

  setGallery(img).setting.imagearray.length.. or 
 var gallary = setGallery(img);
 gallary.setting.imagearray.length....

2) Сделайте setGallary классом типа simpleGallery и определите myGallary как открытый член, используя этот

  var setGallery = function(img){
   ................
    this.myGallary = new simpleGallery( ..
   .. .. 

   }

   then access it as 
   var gallary = new setGallary(img);
   gallary.myGallary.setting.imagearray.length

3) грязным способом, создайте глобальную переменную для хранения объекта myGallary и назначьте ее в setGallaryработать и использовать его где угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...