基本理解问题:对象范围

问题描述

| 当我在这样的普通函数中实例化一个对象(简单)时:
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”的实例。因为在函数setgallery中声明了对象“ mygallery \”,所以它是一个本地对象,该对象将在函数完成后丢失。但是simplegallery绑定了与设置交互的事件,这些事件是simplegallery的属性...当触发事件时,这些属性为何仍然有效? 但是,这样的实例可以生存多长时间,为什么呢? 问题:如何从setgallery之外的其他函数访问此实例的属性? 就像当我想获取mygallery.setting.imagearray.length的值时... 感谢您帮助我理解! :-)     

解决方法

Javascript具有函数作用域,函数内部的所有变量 (用var声明)仅在该位置和该位置的任何位置可见 功能。 函数是一个对象,该对象的生存期 离开函数主体时不一定会结束。例如
setGallery
将\'活\',因为
mygallery
继续\'活\',但是 失去对
mygallery
的访问权限(我敢肯定会有很多 其他职位的解决方案建议)。     ,在这种情况下,函数结束后不会破坏局部变量,因为simpleGallery设置了我想为DOM绑定的事件。您会看到,如果javascript看到某些对象被其外部的某些对象引用,则这些对象会将它们保存在内存中。 该对象将一直保留到程序结束的内存中,否则将清除所有引用。 要获得
imagearray.length
,您需要在对象范围内触发一些事件。为此,您需要更改
simpleGallery
类以设置事件,并在
this
范围内触发回调函数 如果在example5ѭ构造函数中添加以下示例,则
domElement
上的
onclick
事件将在
simpleGallery
实例范围内触发函数
someYourFunction
。因此,在此功能中,您将可以使用
this.imagearray.length
var self=this;
domElement.addEventListener(
  \"click\",function(event) {someYourFunction.apply(self,event)},false);
    ,设置是simpleGallery的公共成员,因此您可以访问其对象上的设置。现在,您需要管理simpleGallery对象(myGallary)来访问设置,此操作的可能方法可以是以下之一: 1)从setGallery返回mygallery对象,然后可以通过以下方式调用它
  setGallery(img).setting.imagearray.length.. or 
 var gallary = setGallery(img);
 gallary.setting.imagearray.length....
2)将setGallary设为诸如simpleGallery之类,并使用this将myGallary定义为public成员
  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函数中对其进行分配,并在任何地方使用它。