javascript:检测对象递归的工具

时间:2017-10-26 23:28:15

标签: javascript

昨天我花了很长时间追逐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;
  }
});

基本上读编写fooa对象的b属性会导致无限循环。

1 个答案:

答案 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)