2014-11-14 43 views
0

在維基百科(http://en.wikipedia.org/wiki/Closure_(computer_programming))的此示例中,它聲稱調用變量closure1closure1(3)將返回4。有人可以通過這個例子 - 我不明白。關閉 - 澄清變量和函數

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

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

Invoking the variable closure1 (which is of function type) with closure1(3) will return 4, while invoking closure2(3) will return 8. While closure1 and closure2 are both references to the function incrementBy, the associated environment will bind the identifier x to two distinct variables in the two invocations, leading to different results. 

如果有幫助,這是我目前的理解。 variable closure1 = startAt(1)將變量closure1設置爲功能startAt(),其默認初始化爲1。但是,調用closure1(3)會將此默認值設置爲3。我不明白的是y來自哪裏。

variable closure1 = startAt(1) 
+0

相關:[JavaScript關閉如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – apsillers 2014-11-14 14:49:56

+0

關閉只是可憐的人類。類只是窮人關閉。 – leppie 2014-11-14 15:24:05

回答

0

當您運行startAt,你創建一個新的功能。每次運行startAt時,都會創建一個全新的功能。因此,我們的理解是代碼

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

創建兩個不同的功能和將它們存儲在colsure1closure2函數startAt就像是一個返回新函數的工廠。你已經調用了兩次,並創建了兩個函數。這兩個創建的函數存儲在closure1closure2之內。

以下是「關閉」的含義:每個功能都圍繞自己的可變環境齲齒。變量環境是函數可以看到的一組外部變量。一個函數根據當前在範圍內的所有變量創建它的變量環境。 (封閉的技術定義是:「功能代碼變量環境」。)

何時startAt調用創建一個新的功能,新的功能構建其可變環境。新函數的變量環境包括在startAt的特定調用範圍內存在的變量x

因此,第一次打電話給startAt(1)有一個變量x,等於1。在startAt調用中創建的函數具有可變環境,包括x等於1.

函數可以有參數。由startAt創建的函數每個都需要一個名爲y的參數。因此,在調用創建的函數時執行x + y時,y作爲該特定調用的參數提供,x由該函數的變量環境提供。當您撥打closure1(3)時,參數y的值爲3,並且值x(來自函數的可變環境)爲1,因此您會得到結果4

第二次致電startAt創建了一個全新變量x。該x的值爲5。第二次調用startAt創建的函數具有不同的可變環境,其中包括這個新的x,其值爲5。當你用closure2(3)調用新創建的函數時,我們有x=5y=3,所以x+y給出結果8

+0

我明白:「第一次調用startAt(1)的變量_x_等於1.」我不這樣做:「由startAt創建的函數每個都需要一個名爲_y_的參數」。 'y'從哪裏來? – Snowcrash 2014-11-14 19:47:31

+0

@SnowCrash從創建函數的定義:注意'函數incrementBy(y)'中的'y'。參數是函數局部變量(其值爲函數調用時間)。通過指定一個形式參數'y',你可以說:「每當這個函數被調用時,它就會被提供一個值,我們稱這個提供的值爲'y'。 – apsillers 2014-11-14 20:06:24