Javascript:是这个闭包函数

Javascript : Is this closure function

本文关键字:闭包 函数 Javascript      更新时间:2023-09-26
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在"垃圾收集 - 关闭"下的文章。

3.MSDN - 请参阅"关闭"部分。

4.堆栈溢出帖子 - 请参阅接受的答案。

5.堆栈溢出柱

6.另一篇引人入胜的文章 - 见最后两段。

不,sequence根本不是函数;所以它不是闭包。

find函数是一个闭包。它被递归调用,并维护对父作用域中goal变量的引用。然而,它不会超过findSequence调用,因此我们不利用此功能。在这里,递归的额外函数的使用非常好。

我被教导要避免关闭。

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

序列是闭包函数吗?

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

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

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

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