【问题标题】:Javascript : Is this closure functionJavascript:这是闭包函数吗
【发布时间】:2013-07-10 21:43:45
【问题描述】:
function findSequence(goal) {
   var find = function (start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
    else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
  }
  return find(1, "1");
}

var sequence = findSequence(24);

sequence 是闭包函数吗?如果是,那么以这种方式使用闭包是否更可取?网络资源教会了我如何避免关闭。

更新:

我在 cmets 中被要求展示网络资源。这些是我在网上看到的更可靠的资源。

1.MDN - Closures 在“性能注意事项”下。

2.Addy Osmani's Article 在“垃圾收集 - 闭包”下。

3.MSDN - 参见“闭包”部分。

4.Stack Overflow Post - 查看已接受的答案。

5.Stack Overflow Post

6.another intresting article - 见最后两段。

【问题讨论】:

  • 你被教导要避免关闭?否则我们会教你。实际上你不能真正避免它们,它们是内置在语言中的。请分享指向该错误“网络资源”的链接,以便我们知道要避免使用该资源……
  • 谷歌搜索中的“javascript关闭内存泄漏”。
  • MDN性能考虑部分下。
  • 好吧,那就不要使用任何技术。如果滥用可能会导致伤害:-)
  • 如果我是 JavaScript 专家,您的评论可能会很合适。只是想获得更深入的知识。我总是不好意思在 SO 上发布东西,面对这样的问题。

标签: javascript


【解决方案1】:

不,sequence 根本没有功能;所以不是closure

find 函数一个闭包。它被递归调用并维护对父作用域中goal 变量的引用。然而它并没有超过findSequence 调用,所以我们不使用这个特性。在这里使用额外的递归函数非常好。

我被教导要避免关闭。

没必要。也许他们需要更多的内存,但不要在意。如果它们派上用场(由于它们的力量而经常发生)并且您发现它们很有用,那么使用它们。不要这样做premature optimisation。只有当您遇到实际的性能问题时,您才可能考虑解决这些问题。

【讨论】:

    【解决方案2】:

    序列是闭包函数吗?

    没有。它只是在一个范围内进行递归。

    【讨论】:

      【解决方案3】:

      sequence是一个变量,它被分配了来自findSequence(24);的返回值

      【讨论】:

        【解决方案4】:

        不,不是。您只是在函数中递归并返回结果。执行此类操作时会创建闭包。

        function getFun(param){
            var x = 5;
            return function(){
                return param * x; // Here closure is created, variables param and x are retained.
            }
        }
        
        var foo = getFun(5);
        alert(foo()); // alerts 25
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多