2013-09-01 30 views
2

我不明白下面的JavaScript代碼的意義:我不明白下面的JavaScript代碼的意義:

var func = f() 
    func() 

任何人都可以負擔得起它給我解釋一下?誠然,我不是JavaScript專家。 我對淨髮現的完整代碼給出:

var a = 1 
function f() { 

    function g() { 
    alert(a) 
    } 

    return g 
} 

var func = f() 
func() // 1 

它試圖說明關閉,lexicalenvironment。任何幫助表示讚賞。我發現它http://javascript.info/tutorial/closures

+2

「意義」是什麼意思?你在哪裏找到代碼? – Pointy

+0

這段代碼的作者會不會在某些地方添加一些分號,還是來自VB背景? – Jivan

+0

@Pointy http://javascript.info/tutorial/closures – rosemary

回答

1
  1. function f()聲明的函數。這意味着你可以稍後調用它,但代碼本身不會執行。

  2. var func = f()調用函數f,並將其結果分配給變量func。由於freturns g,func等於g(它觸發警報)。

  3. 最後,func()調用分配給它的函數,並顯示警報。

這裏要注意的重要一點是聲明和函數調用的區別。 func本身只是一個賦值函數的變量,其中func()實際上運行該函數。如果有幫助,你可以把func想象成是一個指向函數的「指針」(儘管事實並非如此)。就像其他人指出的那樣,這不是封閉的最好例子,但更多的是這些函數是Javascript中的對象。

+0

由於問題是關於閉包,所以需要注意的是,這段代碼不會創建一個。一個將被提醒的值仍然由全局範圍決定,而不是本地範圍。在OP引用的教程中,後面的功能使用類似的策略來創建真正的關閉。 – 2013-09-01 15:11:18

1

f()的調用返回函數g並將其分配給變量func

呼叫func()然後執行g(),其顯示警報消息。

0

實際上,這不是說明封閉的最好例子。它只是不創建它。

要正確地說明在這種情況下,封閉的代碼應該是以下幾點:

function f() { 

    var a = 1 

    function g() { 
    alert(a) 
    } 

    return g 
} 

var func = f(); 
func() // 1 

所以問題是,當函數f獲取的執行返回的功能g,其中包含到執行上下文的參照被調用函數f(它包含所有變量,在函數內部聲明,傳遞參數,作用域鏈等)。通常在執行垃圾回收器應該已經從內存中移除執行上下文之後,但是返回的函數g持有對它的引用,所以它不會被移除。

當函數func被調用時,它從所謂的閉包訪問變量a併發出警報,但是沒有其他方法可以再訪問這個變量。

如果你不想深刻理解那裏發生了什麼,我建議你閱讀this article。它很古老,但非常詳細地解釋了這個話題。

我最近發現的其他good one有點容易理解,所以你可以先從它開始,然後回到我提到的第一個。

希望這有所幫助。