据我所知,在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.prototype替换了a.bar,现在,我没有循环引用错误。
我认为这意味着无法通过引用为Object.prototype分配值。谁能确认一下?这是规则的例外(至少如果确实有一个)?
谢谢!
答案 0 :(得分:2)
这不是错误。这只是一个印刷大会。
答案 1 :(得分:1)
不,这似乎只是你控制台的一个异常现象。你在哪个浏览器遇到过这个?例如,Opera的Dragonfly不会列出函数的任何属性。
另外,我还没有看到一个控制台在记录的对象中发出循环引用...
然而,循环引用也出现在你的第二个例子中。只是尝试打印b.foo.prototype.foo.prototype.foo...
:-)它只会不会这样显示,因为函数的“prototype
”属性是不可枚举的(参见spec 13.2, #18)。