2

Javascriptでは、変数は常に参照によって割り当てられることを理解しています。つまり、次のように書くと:

var a = {};
var b = a;
b.foo = 'string';
console.log(a.foo); // prints 'string'

そうです、次のコードを書くとエラーが返されます。

var a = function(){};
var b = function(){};

b.foo=a;
a.bar = b;

console.log(a); // prints { [Function] bar: { [Function] foo: [Circular] } }

a.bar が b を指し、b.foo が a を指し、その .bar パラメータが再び b を指すなど、これで問題ありません。これは循環参照です。

さて、次のことに気付きました。

var a = function(){};
var b = function(){};

b.foo=a;
a.prototype = b;

console.log(a); // prints [Function]

a.bar を a.prototype に置き換えたところ、循環参照エラーは発生しなくなりました。

これは、 Object.prototype に参照によって値を割り当てることができないことを意味していると思います。誰でも確認できますか?これはルールの例外ですか (少なくともそれが真実である場合)?

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

4

2 に答える 2

2

これはエラーではありません。それは単なる印刷規則です。

于 2012-05-30T22:27:15.637 に答える
1

いいえ、それはあなたのコンソールの単なる異常のようです. これはどのブラウザで発生しますか? たとえば、Opera の Dragonfly は、関数のプロパティを一覧表示しません。

また、ログに記録されたオブジェクトの循環参照について不満を言うコンソールも見たことがありません...

それでも、循環参照は2番目の例にもあります。印刷してみてくださいb.foo.prototype.foo.prototype.foo...:-)prototype関数の " " プロパティは列挙できないため、そのままでは表示されません (仕様 13.2、#18 を参照)。

于 2012-05-30T22:24:25.347 に答える