-3

これらのいずれかが未定義の動作に依存しているかどうか、および/またはそうしないように適応できるかどうかを知りたいです。

例 1 :

var str = {
  ver: '1.01',
  verdesc: 'WIP',
  composite: {
    version_block: str.ver + str.verdesc
  }
}

例 2 :

var str = {
  ver: '1.01',
  verdesc: 'WIP',
},
composite: {
  version_block: str.ver + str.verdesc
};
4

2 に答える 2

2

オブジェクト リテラル自体から、オブジェクト リテラルを介して定義されたプロパティを参照しようとしています。これは不可能です。プロパティは、オブジェクト リテラル全体が評価されたstrにのみ変数に割り当てられます。したがって、オブジェクト リテラル内では、 のプロパティを参照できません。str

したがって、オブジェクト リテラルを変数に代入すると、

var obj = { ... };

次に、そのオブジェクト リテラル内では、参照をまったく使用できません。objオブジェクト リテラルが評価される時点でobjはまだであり、オブジェクト リテラルが完全に解析および評価されたundefinedでのみ、対応するObject値が作成され、 に割り当てられます。obj

var obj = {
    a: 123,
    b: obj.a // this will throw, "obj" is undefined
};
obj.b = obj.a; // this works
于 2012-08-08T01:46:13.057 に答える
1

http://jsfiddle.net/kendfrey/XwVFt/

エラーメッセージはそれをすべて説明しています。

そんなことはできません。オブジェクト全体が作成されたに変数が割り当てられるまで、変数のプロパティにはアクセスできません。

これを回避するには、オブジェクトを割り当ててから、そのプロパティ設定します。

var str = { };
str.ver = '1.01';
str.verdesc = 'WIP';
str.composite = {
  version_block: str.ver + str.verdesc
}
于 2012-08-08T01:49:39.910 に答える