2

次のコードを見てください。

var test = {

    test2 : {
        variable: 'hello world',

        test3: {
            test4 : test.test2.variable  
        },

        echo : function() {
            alert(test.test2.test3.test4);   
        }
    }

};

test.test2.echo();

jsfiddle

test4 が変数にアクセスできない理由:

test4 : test.test2.variable 

タイトルも自由に変更してください。より良いタイトルが見つかりませんでした。

ありがとうございました!

4

3 に答える 3

5

test評価されるundefined時点です。test.test2.variable

式は裏返しに評価されるため、コードは次の順序で次のことを行います。

  1. オブジェクトを作成する
  2. オブジェクトを作成する
  3. variableプロパティを (2) に添付する
  4. 別のオブジェクトを作成する
  5. test4値が評価の結果であるプロパティを (4) にアタッチします((1) までテストが割り当てられていないため、test.test2.variableこれは失敗します)。
  6. test3値が (4) である最初のプロパティにアタッチします
  7. 関数インスタンスを作成する
  8. echoプロパティを (2) に添付する
  9. test2(2) を指すプロパティを (1) にアタッチする
  10. (1) を変数 に割り当てますtest

最新のブラウザーに依存でき、頻繁に読み取られる可能性が低い場合、またはtest適切に初期化された後に割り当てることができる場合は、以下のように getter を使用して (5) の評価を遅らせることができます。

 var test = { 
   test2: {
     variable: "foo",
     test3: {
       get test4 () { return test.test2.variable; }
     }
   }
 };

または下位互換性を高めるために

 var test = {
   test2: {
     variable: "foo",
     test3: {
       test4: null
     }
   }
 }
 test.test2.test3.test4 = test.test2.variable;
于 2013-03-27T19:12:06.207 に答える
3

testまだ割り当てられていないためです。Javascript インタープリターは、最初に右側の JSON リテラルを解析し、次に値をtest変数に割り当てます。

var test = {...}

それを修正するには、これを行うことができます:

var test = {
    test2 : {
        variable: 'hello world',
        test3: {

        },
        echo : function() {
            alert(test.test2.test3.test4);   
        }
    }
};
test.test3.test4 = test.test2.variable;
于 2013-03-27T19:12:15.143 に答える
0

これはうまくいくはずです。マイク・サミュエルが良い説明をしてくれたので、私はそれを説明していません.

var test = {

    test2 : {
        variable: 'hello world',

        test3: {
            test4 : function (){return test.test2.variable  }
        },

        echo : function() {
            alert(test.test2.test3.test4());   
        }
    }        
};

test.test2.echo();
于 2013-03-27T19:28:28.967 に答える