繁体   English   中英

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

[英]Why do we have closures in JavaScript?

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

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

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

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

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

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

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

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

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

the functions/blocks-of-code in program. 有时我们需要程序中函数/代码块所需的变量。 我们可以将这些变量作为全局变量。

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

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

闭包是一种功能,具有执行所需的所有环境。 在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函数范围,破坏其变量。 但是,由于我们有一个使用文本的匿名函数,我们必须跟踪这个变量。 这可以通过值或通过引用来实现,具体取决于语言(保持变量活着(可以在之后修改它,或者在创建函数时复制其值))。

我希望这有帮助 !

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM