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

それはなぜです?これを 1 つのステートメントで機能させるにはどうすればよいですか?

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 に答える