6

给定 JavaScript 对象内的 Array Literal,访问其自身对象的属性似乎不起作用:

 var closure =  {

         myPic : document.getElementById('pic1'),
         picArray: [this.myPic]
 }    

 alert(closure.picArray[0]); // alerts [undefined]


而通过访问其他 JavaScript 对象来声明一个数组项似乎有效

 ​var closure1 = {
 ​    
 ​     myPic : document.getElementById('pic1')
 ​}
 ​    
 ​var closure2 =  {
 ​  
 ​        picArray: [closure1.myPic]
 ​}    
 ​    
 ​alert(closure2.picArray[0]); // alerts [object HTMLDivElement]


示例:http: //jsfiddle.net/5pmDG/

4

2 回答 2

10

this值不会那样工作,它指的是由实际执行上下文确定的值,而不是您的对象文字。

例如,如果您声明对象的函数成员,您可以获得所需的结果:

var closure =  {
  myPic: document.getElementById('pic1'),
  getPicArray: function () {
    return [this.myPic];
  }
};
//...
closure.getPicArray();

由于函数this内部的值getPicArray将引用您的closure对象。

请参阅另一个问题的答案,我在其中解释了this关键字的行为。

编辑:响应您的评论,在我提供的示例中,该getPicArray方法每次调用时都会生成一个新的 Array 对象,并且由于您想要存储数组并对其进行更改,我建议您像这样,分两步构造你的对象:

var closure =  {
  myPic: document.getElementById('pic1')
};
closure.picArray = [closure.myPic];

closure.picArray然后您可以毫无问题地修改成员。

于 2010-07-25T19:42:43.113 回答
2

this属性不指向该closure对象。如果我们要在全局范围内定义 myPic 属性,那么您将看到picArray使用该值进行初始化。考虑这个例子:

<script>
window.myPic = "Global myPic";

var closure =  {
    myPic : document.getElementById('pic1'),
    picArray: [this.myPic] // this refers to the global object
};

console.log(closure.picArray); // ["Global myPic"];
</script>

this是 JavaScript 中最难的概念之一。您可能会喜欢这篇关于该主题的文章。

于 2010-07-25T19:40:26.340 回答