为什么我们在JavaScript中有闭包?

时间:2010-07-20 10:08:01

标签: javascript closures

围绕JavaScript关闭我的头脑,我正处于事情正在发生的地步;即 闭包是函数的局部变量 - 在函数返回后保持活动,或者 闭包是一个堆栈帧,在函数返回时不会释放。

我开始明白这个概念,但我越了解我就越不知道为什么我们必须使用它们。

像这样的一个例子让我理解这个概念,但让我问,有一种更简单的方法可以做到这一点!

function sayHello(name) {
   var text = 'Hello ' + name;
   var sayAlert = function() { alert(text); }
   sayAlert();
}
sayHello('Gath');

我只是想知道为什么我必须保持局部变量存活?功能退出后?

我在哪里可以看到闭包实现的解决方案的示例,除了闭包之外什么都没有用?

5 个答案:

答案 0 :(得分:7)

闭包为语言增添了表达力。由于闭包,有一些模式可以很容易地实现。想到的一些例子包括:

答案 1 :(得分:4)

“封闭是一个穷人的对象。一个对象是一个穷人的封闭。” (对不起,我忘记了来源)。

有时我们只需要一个代码块所需的变量。我们将该代码块放在一个函数中,并将这些变量作为该函数的局部变量。

有时我们需要所有程序中的函数/代码块所需的变量。我们可以将这些变量作为全局变量。

有时我们需要一些函数/代码块所需的变量。例如,我们有一个名为Sales的实体,我们希望将所有与销售相关的代码放在一起。因此,我们有一组功能和一组处理销售的变量。我们可以将这些函数和变量放在一个对象中,以便它们与代码的其他部分隔离(包括函数和变量)。

在不直接支持对象的语言中,我们可以使用嵌套函数。外部函数就像类一样,内部函数就像方法一样。外部函数的局部变量就像字段一样,它们只能由内部函数访问。在对内部函数的后续调用中,我们希望维护local-to-outer-function变量的状态,这是需要闭包的地方。我们所要做的就是通过外部函数的输出将任何内部函数的引用传递给外部函数外部的代码,这样即使在外部函数退出之后,内部函数访问的外部函数的变量也会被保留。

答案 2 :(得分:2)

闭包是一个具有执行所需的所有环境的函数。 在javascript中,使用外部作用域中的变量创建匿名函数(= lambda)。

你可以用这样的代码更好地理解为什么:

function foo()
{
  var text = computeFromOutside();
  // ... other lines of code
  return function(otherText) { return text + otherText; }
}

bar = foo();

function baz(fun)
{
  return fun("some text");
}

在这里,您将返回一个使用局部变量“text”的函数。 因此,您将离开foo函数范围,破坏其变量。 但是,由于我们有一个使用文本的匿名函数,我们必须跟踪这个变量。 这可以通过值或引用来实现,具体取决于语言(保持变量处于活动状态(之后可以修改它,或者在创建函数时复制其值)。)

我希望这有帮助!

答案 3 :(得分:0)

您选择的示例显示在this page上,因此我假设您从那里获取了它。你看过它提供的所有其他例子了吗?他们比我可能更好地解释关闭的动机。

答案 4 :(得分:0)

普通函数执行其操作,计算结果并返回它。通过返回一个闭包,你可以在整个过程中打包你的工作,并让呼叫者在准备就绪时获得更多。自从我在大学里尝试Scheme以来,我一直渴望用自己所使用的每种语言来封闭......因为它们是危险的习惯形成!

它们也可以说是未来的重要组成部分:以及其他功能编程机制,它们似乎非常适合多核系统的并行编程。