2010-07-20 65 views
13

我正在围绕JavaScript关闭进行包装,并处于正在落实的地步;即 闭包是函数的局部变量 - 在函数返回后保持活动状态,或者闭包是当函数返回时不释放的栈帧。为什么我们在JavaScript中关闭?

我开始理解这个概念,但我越了解越多,我一直想知道为什么我们必须使用它们。

像这样的一个例子让我理解了这个概念,但让我问,有这样一个更简单的方法!

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

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

我在哪里可以得到示例显示解决方案实现的封闭,并没有别的工作,但封闭?

+7

在这里寻找一大堆答案:http://stackoverflow.com/questions/111102/how-does-a-javascript-closure-work – 2010-07-20 10:09:38

回答

7

闭包增加了语言的表现力。有一些模式因关闭而很容易实现。浮现在脑海中的一些例子包括:

0

你选择的例子出现在this page,所以我假设你从那里拿走了它。你看过它提供的所有其他示例吗?他们比我想象的更好地解释关闭的动机。

+0

是的,我做了,但他们仍然没有展示一个场景一切都失败了,关闭是唯一可以做到的伎俩 – gath 2010-07-20 13:53:48

+0

@gath - 是的。这些示例中的很多都是具有其他函数作为其返回值的函数。如果调用外部函数,请保存对返回函数的引用,然后稍后调用返回的函数,但这些示例在没有关闭的情况下可能无法正常工作。 – 2010-07-20 17:02:50

+0

@gath:一切都可以用汇编写成。关闭不是为了解决之前无法解决的问题而发明的,因此您不会发现任何只能通过关闭才能解决的问题。他们会让某些问题更容易解决,如果您在考虑这些问题时重新考虑这些例子,他们可能会开始对您更有意义。 – 2010-07-20 23:08:42

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"); 
} 

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

我希望这有助于!

0

正常功能做了东西,计算结果并返回。通过返回闭包,您可以部分打包工作,并在呼叫准备就绪时让呼叫者获得更多。因为我在大学里尝试过Scheme,所以我一直渴望用我使用过的每种语言关闭,因为......它们危险地形成习惯!

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

2

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

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

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

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

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

+0

这是一个很好的比喻 – qodeninja 2014-01-28 08:47:40