0
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 - “性能注意事项”下的闭包。

2. Addy Osmani在“Garbage Collection - Closures”下的文章。

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

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

5.堆栈溢出帖子

6.另一篇有趣的文章——见最后两段。

4

4 回答 4

2

不,sequence根本没有功能;所以它没有关闭

find函数一个闭包。它被递归调用并维护对goal来自父范围的变量的引用。然而它并没有比findSequence通话时间长,所以我们不使用这个功能。在这里使用额外的递归函数非常好。

我被教导要避免关闭。

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

于 2013-07-12T11:00:08.443 回答
1

序列是闭包函数吗?

不,它只是在一个范围内进行递归。

于 2013-07-12T10:59:44.120 回答
0

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

于 2013-07-12T11:02:57.140 回答
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
于 2013-07-12T11:11:47.150 回答