2011-06-26 27 views
2
function f1(){ 
     var n=999; 
     function f2(){ 
      alert(n); // 999 
     } 
    } 

是函數f2()一個閉包?如果不?爲什麼?這是javascript中的函數嗎?

但在這篇文章中。 How do JavaScript closures work? 爲什麼它說:

function foo(x) { 
    var tmp = 3; 
    function bar(y) { 
    alert(x + y + (++tmp)); 
    } 
    bar(10); 
} 
foo(2) 

這不是一個closure.A閉包是當您返回的內部函數。內部函數將在離開前關閉foo的變量。爲什麼?

但我不知道我所做的例子和另外一個引用的例子有什麼區別,一個不是閉包,但有一個是。我認爲這兩個例子是一樣的。

+0

是的......不多說了 – Endophage

+0

是什麼引發了這個問題?你期待什麼答案?更多的上下文將導致更好的答案... – Cameron

+0

我已經更新了我的queston。謝謝。 – runeveryday

回答

3

是的,f2是一個閉包,因爲它從外部範圍訪問變量(n)。 (好吧,這不是真的關閉 - 請參閱下面的更新)。

nf1之內申報,而不是f2;這使得它屬於f1的範圍。因此,當您創建引用n的函數f2時,它是一個定義的閉包,因爲它使用其他人的變量。

UPDATE

好吧,如果我理解answer你鏈接到正確的,它說,f2封閉,因爲它僅僅是訪問其範圍內的變量(就像一個if語句,它在大括號*中獲取它自己的作用域,可以使用來自外部作用域的變量而不需要關閉)。

* 更新:原來,只有函數在Javascript中有自己的作用域,而不是任何舊塊。但我的觀點仍然有效...

然而,f2將成爲閉合,如果它離開f1的範圍(例如,通過返回);在那種情況下,即使f1的原始範圍不再存在(它在控制離開函數時退出),它仍然可以訪問f1的變量nf2將「關閉」f1的變量,從而人爲延長f1的使用壽命。

就我個人而言,我仍然會打電話給f2關閉,即使它永遠不會離開f1。如果一個函數可以簡單地通過在其聲明範圍之外使用閉包,並且它在該範圍內的行爲沒有區別,無論它在技術上是否是閉包,那麼我認爲沒有必要區分。我甚至會說,它是一個實施細節,不管是否是封閉的,如果它從不離開f1的範圍。

另一方面,忽略這種區別意味着任何使用全局變量的函數都會被稱爲「閉包」,因爲它從外部範圍訪問變量。因此,只有當它離開範圍時它才變爲閉包,它所使用的變量在中定義爲值得(儘管很細微)的區別。

我想我可以給出的最清晰的答案是它不是封閉

+0

我已更新我的任務。有一個像f2函數的例子。但它說這不是封閉。謝謝。 – runeveryday

+0

@runeveryday:我已經更新了我的答案;-) – Cameron

+0

我很抱歉,我還是非常瞭解它:) – runeveryday

1

它是一個閉包,因爲它依賴於中間變量(即不是局部或全局)範圍內的變量的值,並且如果變量發生變化,閉包的操作也會如此。價值永遠是一樣的是偶然的。

然而,您可能想要將封閉返回給f1()的調用方,以便可以在其他地方使用它。

+0

我已經更新了我的queston。謝謝。 – runeveryday

相關問題