昨天我花了很长时间追逐javascript中的一个奇怪的bug,结果是由各种setter中的循环引用引起的。基本上设置Object的属性会运行一个函数;该函数还导致在另一个对象上设置属性,而另一个对象又运行另一个函数,该函数又在第一个对象上再次设置属性...呃!在构建过程或工具中,有没有办法可以检测循环引用?这是一个愚蠢的事情的简化例子:
var a = {}, b = {};
Object.defineProperty(a, "foo", {
get: function() {
return b.foo;
},
set: function (value) {
b.foo = value;
}
});
Object.defineProperty(b, "foo", {
get: function () {
return a.foo;
},
set: function (value) {
a.foo = value;
}
});
基本上读或编写foo
或a
对象的b
属性会导致无限循环。
答案 0 :(得分:1)
由于您要求使用工具,这绝对不是答案,除了尝试查看调用堆栈之外,我没有找到任何此类工具。
但是,我可以通过多种方式避免无限递归,我可以添加条件,如果满足条件,函数应该返回。这就是我们如何处理递归函数。
例如,其中一个是使用计数器或其他变量或属性,并确保该函数只返回一次数据,
var a = {}, b = {};
var callCounter = 0;
Object.defineProperty(a, "foo", {
get: function() {
if(++callCounter < 2){
console.log("Getting value from some other object since I don't have it.")
return b.foo;
}else{
console.log("Why was I called again? :/");
callCounter = 0;
return null;
}
},
set: function (value) {
b.foo = value;
}
});
Object.defineProperty(b, "foo", {
get: function () {
return a.foo;
},
set: function (value) {
a.foo = value;
}
});
console.log(a.foo)