0

私は JavaScript を初めて使用するので、正しい用語を使用していない可能性があります。ご容赦ください。

http://jsbin.com/IPaDAJO/1/

ページに次のように表示されることを期待しています。こんにちは、John Smith と申します。29 歳です。こんにちは、私の名前は Suzie Alport です。24 歳です。

スージーがジョンの挨拶方法を参照できない理由を知りたいのですが?

<script>
        var employees = {
            john: {
                name: "John Smith",
                age: 29,
                job: "web developer",
                greet: function(){
                    document.write("Hello my name is " + this.name + " and I am " + this.age + " years old. ");
                }
            },
            suzie: {
                name: "Suzie Alport",
                age: 24,
                job: "nursery assistant",
                greet: employees.john.greet
            }
        };
        employees.john.greet();
        employees.suzie.greet();
</script>

ありがとう

4

1 に答える 1

2

suzieプロパティに割り当てるオブジェクトを作成してemployeesいる時点で、undefined. プロパティ初期化子は、式全体が完了する前に評価されます。

上記の順序は次のとおりです。

  1. エンジンはemployees、初期値で呼び出される変数を作成しますundefined
  2. エンジンは空のオブジェクトを作成します (これは最終的に に割り当てられますemployees)。
  3. エンジンは別の空のオブジェクトを作成します (最終的にjohnプロパティ値になります)。
  4. "John Smith"という #3 の空のオブジェクトのプロパティを評価して作成し、nameその値を与えます。
  5. agejob、に対してそのプロセスを繰り返しますgreet
  6. john上記の #2 のオブジェクトのプロパティにそのオブジェクトを割り当てます。
  7. 別の空のオブジェクトを作成します( になりますsuzie)。
  8. "Suzie Alport"という #7 のオブジェクトのプロパティを評価して作成し、nameその値を与えます。
  9. ageとのプロセスを繰り返しますjob
  10. 式を評価しようとしますが、 isのemployees.john.greetため失敗します。employeesundefined

2つに分割すると、うまくいきます(document.write爆発するまで):

var employees = {
    john: {
        name: "John Smith",
        age: 29,
        job: "web developer",
        greet: function(){
            document.write("Hello my name is " + this.name + " and I am " + this.age + " years old. ");
        }
    }
};
employees.suzie = {
    name: "Suzie Alport",
    age: 24,
    job: "nursery assistant",
    greet: employees.john.greet
};
employees.john.greet();
employees.suzie.greet();

を評価しようとする前にemployees.john.greet、上記の #2 で作成されたオブジェクトへの参照がemployees変数に割り当てられているため、これは機能します。


サイドノート:

document.write最新の Web ページやアプリケーションでの使用は避けてください。代わりに、DOM メソッドを使用してください。最初のページdocument.writeの読み込み時に希望する方法でのみ機能します。最初のページ読み込みの後、既存のドキュメントを完全に消去し、同じウィンドウで新しいドキュメントの書き込みを開始します。

たとえば、次のdocument.bodyように段落を追加できます。

function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = String(msg);
  document.body.appendChild(p);
}

上記の両方を使用した実際の例( source )

于 2013-09-13T12:14:54.173 に答える