javascript - 为什么这是递归并导致无限循环?

标签 javascript backbone.js recursion

我正在扩展 Backbone.View 以支持 subview ,并且我有一个 addSubview 方法,该方法仅将 Backbone View 添加到哈希中。很容易。我现在尝试做到这一点,以便每当您销毁一个 View 时,它都会销毁所有 subview 。我认为这也很容易,但我的方法陷入了无限循环:

destroy: function () {
  debugger;
  // Call destroy on all subviews. If the subviews have subviews they'll
  // be destroyed as well
  for (var v in this._subviews) {
    this._subviews[v].destroy();
  }

  // Instead of calling `delete` on every view we wipe everything out after
  // we're done destroying all the views
  this._subviews = {};

  // Finally, since all the subviews are destroyed it's safe to destroy
  // this view
  this.remove();
},

发生的情况是,第一次调用该调试器,this 是调用 destroy 的 View (右),第二次在第一个 subview 上调用它(右),第三个 - ∞ 它仍然继续调用第一个 subview 。一步步玩下去吧:

  1. 点击调试器
  2. 到达 this._subviews[v].destroy(); 行且 v == 第一个 subview
  3. 跳回到顶部调试器。

仅此而已。并且它会永远重复。有什么想法或建议吗?

演示:http://jsbin.com/iyApuga/1/edit

最佳答案

这里发生的是 object_subviews正在存储在 Foo.View的原型(prototype)(Backbone 的 extend 方法正在执行此操作),因此由 Foo.View所有实例共享。这是设置的地方:

Foo.View = Backbone.View.extend({
    _subviews: {},  // right here

这会导致问题,因为当您添加第一个 subview 时,它会添加到 this._subviews 。因为_subviews对象被 View 的每个实例共享,当你向 subview 添加 subview 时,所有其他 View 都认为View是它们自己的 subview 。

具体来说,这里发生的事情是当您调用 .destroy() 时,在循环的顶部调用 destroy()在所有 subview 上意外调用 destroy()再次在同一个 View 上。 _subviews直到循环后几行变量才会被清除:

// Instead of calling `delete` on every view we wipe everything out after
// we're done destroying all the views
this._subviews = {};

因此,它变得无限,因为它正在迭代 _subviews 的相同列表。一遍又一遍,卡在第一个似乎永远无法完全删除。

为了让世界幸福,_subviews object 应该是一个实例变量 View而不是 View原型(prototype)。为此,您应该为每个新的View分配一个新的。 :

  initialize: function () {
    this._subviews = {};
  }

关于javascript - 为什么这是递归并导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120242/

相关文章:

backbone.js - 使用 pushstate 深度链接 backbonejs

list - 在 lisp 中 append 列表

c++ - 在多重映射中查找键值链的长度

Javascript 显示/计算过去 3 个月

javascript - .live() 的行为与 .bind() 不同

javascript - 寻找 Backbone.js 中 MVC 的指导

javascript - 主干 - 无法读取未定义的属性 'get'

haskell - 从第二个字符串中删除第一个字符串中的所有字符的函数

javascript - Angular ui 路由器 : child state not accessing parent controller

javascript - ReactJS 中的嵌套对象