为什么JavaScript中有闭包?

为什么JavaScript中有闭包?,javascript,closures,Javascript,Closures,我的脑袋被JavaScript闭包包围着,我已经到了一个万事俱备的地步;即 闭包是函数的局部变量-在函数返回后保持活动状态,或 闭包是在函数返回时未释放的堆栈帧 我开始理解这个概念,但我理解得越多,我就越想知道为什么我们要使用它们 像这样的一个例子让我理解了这个概念,但让我问,有一种更简单的方法可以做到这一点 function sayHello(name) { var text = 'Hello ' + name; var sayAlert = function() { alert(

我的脑袋被JavaScript闭包包围着,我已经到了一个万事俱备的地步;即 闭包是函数的局部变量-在函数返回后保持活动状态,或 闭包是在函数返回时未释放的堆栈帧

我开始理解这个概念,但我理解得越多,我就越想知道为什么我们要使用它们

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

function sayHello(name) {
   var text = 'Hello ' + name;
   var sayAlert = function() { alert(text); }
   sayAlert();
}
sayHello('Gath');
我只是想知道为什么我必须保持局部变量活着?函数退出后


我在哪里可以得到示例,显示通过闭包实现的解决方案,并且除了闭包之外没有其他方法可以工作?

您选择的示例出现在屏幕上,因此我假设您是从那里获得的。您看过它提供的所有其他示例了吗?它们比我所能解释的更好地解释了闭包的动机。

闭包是一个具有执行它所需的所有环境的函数。 在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函数范围,销毁其变量。 然而,因为我们有一个使用文本的匿名函数,所以我们必须跟踪这个变量。 这可以通过值或引用实现,具体取决于语言(使变量保持活动状态(以后可以修改它,或者在创建函数时复制它的值))


我希望这有帮助

闭包为语言增加了表达能力。由于闭包的存在,有些模式很容易实现。我想到的几个例子包括:

  • -Eric Miraglia的例子
  • -奥利弗·斯蒂尔的例子
  • -达斯汀·迪亚兹的例子

    • 普通函数完成它的工作,计算结果并返回它。通过返回一个闭包,您可以在一段时间内完成您的工作,并让呼叫者在做好准备时获得更多。自从我在大学尝试以来,我一直渴望在我使用过的每种语言中使用闭包。。。他们正在形成危险的习惯

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

      “闭包是穷人的对象。对象是穷人的闭包。”(对不起,我忘了源代码)

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

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

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


      在不直接支持对象的语言中,我们可以使用嵌套函数。外部函数的作用类似于类,内部函数的作用类似于方法。外部函数的局部变量的作用类似于字段,它们只能由内部函数访问。在对内部函数的后续调用中,我们希望维护从局部到外部函数变量的状态,这是需要闭包的地方。我们所要做的就是通过外部函数的输出传递对任何内部函数的引用,在外部函数之外进行编码,这样即使外部函数退出后,内部函数访问的外部函数变量也会保留下来。

      在这里查找大量答案:是的,我做了,但他们仍然没有展示一个场景,在这个场景中,其他一切都失败了,而关闭是唯一可以做的事情trick@gath-是的。这些示例中的许多函数的返回值都是其他函数。如果您调用外部函数,保存对返回函数的引用,然后在以后某个时候调用返回函数,那么如果没有闭包,这些示例可能无法工作。@gath:一切都可以用汇编语言编写。闭包的发明并不是为了解决以前无法解决的问题,所以您不会发现任何只能用闭包解决的问题。它们使某些问题更容易解决,如果你考虑到这一点重新审视这些例子,它们可能会对你更有意义。我想我喜欢这一点,但最后一段让我头晕目眩。。。你能添加一些代码来解释这些类比吗?