【问题标题】:Closure circular reference?关闭循环引用?
【发布时间】:2017-10-13 13:26:46
【问题描述】:

看看这段代码

var obj = {
    foo: 5
};

var recursive = (function(){
    if(this.foo === 0){
        return;
    }

    this.foo--;
    recursive();
}).bind(obj);

递归函数是否创建循环引用?如果或如果不是,为什么?

EDIT:函数recursive 和自身之间的循环引用。我还发现了类似的东西here

【问题讨论】:

  • “创造”是什么意思?您希望哪些实体成为参考图的一部分?
  • “递归函数会创建循环引用吗?”介于什么和什么之间?
  • 函数recursive和它自身之间。我编辑了帖子。
  • 为什么不直接用 alert() 试试呢? jsfiddle.net/#&togetherjs=xCifTQpoMU 我不能告诉你为什么它不是一个无限循环。

标签: javascript


【解决方案1】:

递归函数定义是否创建循环引用,如this one here

是的,它仍然存在。 bind 并没有改变这一点,尽管它在参考圈中引入了一个额外的链接。

  • 变量recursive保存绑定函数
  • 绑定函数(通过.bind() 调用创建)包含一个带有原始函数的槽
  • 原始函数(从函数表达式创建)关闭包含recursive 的变量范围

【讨论】:

  • 如何重新设计它以避免循环引用?
  • @JuanDelaCruz 你不能,你绝对不需要。
  • 要清楚一点,使用函数表达式是什么使它成为循环的,对吗?如果我要使用没有绑定的函数定义:function recursive(){ recursive(); } 它不会是循环的?
  • 不,每当一个函数递归地引用自身时,必须在某处是循环引用,函数声明也是如此。为什么要避免这种情况?
  • 不是真的避免,但我想完全理解这个概念和细微差别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多