基本理解问题:对象范围

时间:2011-04-14 08:17:43

标签: javascript scope

当我在像这样的正常函数中实例化一个对象(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的属性......当触发thos事件时,这些属性如何仍然存在?

但是,这样的实例存活了多长时间?为什么?

  1. 问题:如何从setGallery以外的其他功能访问此实例的属性? 就像我想获得mygallery.setting.imagearray.length的价值......
  2. 感谢您帮助我理解! : - )

3 个答案:

答案 0 :(得分:3)

在这种情况下,函数结束后不会销毁局部变量,因为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);

答案 1 :(得分:2)

Javascript具有函数作用域,函数内部的所有变量 (用var声明)仅在其中可见 功能

函数是一个对象,该对象的生命周期 离开功能体时不一定会结束。例如 setGallery将“活着”因为mygallery继续“活着”,但是 mygallery的访问权限丢失了(我相信会有很多 其他职位的解决方案建议。)

答案 2 :(得分:1)

设置是simpleGallery的公共元素,因此您可以访问其对象的设置。现在您需要管理simpleGallery对象(myGallary)来访问设置,可能的方法可以是以下之一:

1)从setGallery返回mygallery对象,然后你可以按照以下方式调用它

  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函数中分配它并在任何地方使用它。