3

我有这个 JavaScript 代码:

var r = {
    a1:function() {
        alert('hey!');
    },
    a2:this.a1
    /*,
    a3:r.a1, //<--Make an error when running
    a4:a1 //<--Make an error when running
    */ 
};

执行时r.a1()我收到警报,但执行时r.a2()我收到消息:

TypeError: r.a2 is not a function

为什么?我怎样才能在一个声明中完成这项工作?

4

2 回答 2

5

this,在您的定义中不是指 r,而是指实际上下文(可能window

你应该这样定义它:

var r = {
   a1: function() {}
   /* a3: r, // Here r is not yet assigned. First the object is created, then its value
             // is assigned to r.
  */
};

r.a2 = r.a1;
r.a3 = r.a1;
于 2012-10-22T09:42:51.840 回答
2

如果你只想使用对象字面量,你可以这样做:

var r = {
    a1:function() {
        alert('hey!');
    },
    a2:function () {
        this.a1();
    }
};

解释是:在对象声明中,this指的是你当前的上下文——也就是this你声明的函数中的值r

正如BiAiB所说,您不能在声明中使用对象的名称(r在这种情况下),因为在创建对象之前不会分配变量。

如果您将函数分配给对象的成员,则当调用该函数时,上下文将引用您的对象,thisr 也是如此。

于 2012-10-22T09:45:29.113 回答