2015-02-05 45 views
0

在试图理解关闭是什么时,我对理解下面的示例在关闭维基百科文章中提供了一些问题。 WikiPage。 您能否帮我理解这一点,并在可能的情况下提供一个容易理解的封闭定义。理解关闭示例难点

function startAt(x) 
    function incrementBy(y) 
     return x + y 
    return incrementBy 

variable closure1 = startAt(1) 
variable closure2 = startAt(5) 
+0

请看看这里:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work我也喜欢这个解释https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Closures – ljnissen 2015-02-05 14:38:10

+1

你能更具体地了解你不明白的东西吗?你知道'closure1'和'closure2'包含'startAt'返回的函数吗? (相关:[JavaScript关闭如何工作?](http:// stackoverflow。问题/ 111102/how-do-javascript-closures-work)) – apsillers 2015-02-05 14:39:14

+0

apsillers,我打我的前额,但现在上面的例子使完成,因为,谢谢。我仍在挖掘ljnissens链接,以便更好地理解如何轻松定义闭包。 – Tyrone 2015-02-05 21:44:42

回答

0

要理解闭包,您首先需要了解范围。范围是变量的生命周期。在范围内声明的变量是天生的,当范围结束时它会死亡。例如:

{    // scope begins 
    var x = 0; // variable x is born 
    var y = 1; // variable y is born 
}    // scope ends, x and y both die 

现在,是保持一个变量,即使活着,它是在结束声明的范围后一种方式。总之,这是变数可以欺骗死亡的一种方式。变量欺骗死亡的方式是通过关闭。

考虑另一个范围内的范围。内部作用域可以访问在外部作用域内声明的所有变量。但是,外部范围无法访问在内部范围内声明的任何变量。

{     // the outer scope has access to x and y only 
    var x = 0; 
    var y = 1; 

    {    // the inner scope has access to x, y and z 
     var z = 2; 
    } 
} 

内部范围访问z,因为它是在内部范围内声明。但是,它也可以访问xy,因为这两个变量位于内部作用域的词法环境(即父作用域)中。

现在考虑如果我们可以将这个内部作用域移到外部作用域之外会发生什么。

{     // the outer scope has access to x and y only 
    var x = 0; 
    var y = 1; 

    {    // the inner scope has access to x, y and z 
     var z = 2; 
    } ---+ 
}  | 
     | 
{ <------+   // the inner scope moved outside of the outer scope 
    var z = 2; 
} 

在这种情况下,外部范围结束。因此,xy应与外部范围一起死亡。但是,他们不能死亡,因为他们仍然需要内部范围。当内部作用域被移到外部作用域之外时,它将成为变量xy(这是它的最高值)的闭包,并且只要它自身存在,它就会保持这些变量的存活状态。这是关闭的总体思路。

现在考虑下面的代码:

function startAt(x) { 
    return incrementBy; 

    function incrementBy(y) { 
     return x + y; 
    } 
} 

var closure1 = startAt(1); 
var closure2 = startAt(5); 

这里,incrementBy函数是一个内部函数。因此,它可以访问属于startAt函数的变量x。但是,当我们从startAt返回incrementBy时,我们正在将外部函数外部的内部函数移动。因此,尽管x应该已经由于startAt的回报而死亡,但它仍然存在,因为它需要incrementBy

因此,incrementBy是一个闭包,因为它在变量x上关闭,并且只要它自身存在就保持活动状态;变量x被称为关闭incrementBy的upvalue。