Javascript:这个闭包功能吗?

时间:2013-07-12 10:57:36

标签: javascript

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是封闭函数吗?如果是的话,以这种方式使用闭包是否更可取?我通过网络资源教我避免关闭。

更新

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

“绩效考虑”下的

1。MDN - Closures

2.“{垃圾收集 - 关闭”下的Addy Osmani's Article

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

4. Stack Overflow Post - 见接受的答案。

5。Stack Overflow Post

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

4 个答案:

答案 0 :(得分:2)

不,sequence根本不起作用;所以它不是closure

find函数一个闭包。它以递归方式调用并维护对父作用域中goal变量的引用。但它并没有超过findSequence电话,所以我们不使用此功能。在这里使用额外的递归函数是非常好的。

  

我被教导要避免关闭。

没必要。也许他们需要更多的记忆,但不关心这一点。如果它们派上用场(通常由于它们的功能而发生)并且您发现它们很有用,那么使用它们。不要做premature optimisation。只有当您遇到实际的性能问题时,您才可以考虑解决它们。

答案 1 :(得分:1)

  

序列是闭包函数吗?

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

答案 2 :(得分:0)

sequence是一个变量,它从findSequence(24);

分配了返回值

答案 3 :(得分:0)

不,不是。您只是在函数中递归并返回结果。当你做这样的事情时会创建闭包。

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