2010-02-27 21 views
6

閉包中的本地函數聲明閉包中存在的具有相同名稱的變量。那麼,我們如何才能從本地函數訪問閉包變量呢?區分閉包和局部變量

function closure() 
{ 
    var xVar; 
    function func1() 
    { 
     var xVar; 
     // how to distinguish local and closure scopes. 
     return xVar; 
    } 
    return function() { return func1(); }; 
} 

創建私有對象並將私有變量作爲此對象的屬性可能會有所幫助。但我想知道是否有更好的和整潔的解決方案。範圍鏈可以提供幫助嗎?

我已編輯完成關閉。無論如何,封閉在這裏並不太受關注,但它可以被認爲是內部功能,但是可能會有某種解決方案。

感謝

回答

3

您無法在JS中顯式訪問作用域鏈。你的問題是可變陰影中古老的問題,但它更令人發狂,因爲在JS中,範圍鏈實際上是,在運行時它有,它只是無法訪問。

你可以玩一些技巧與如果使用討厭with操作rejiggering電流範圍,但(以及arguments的主叫/被叫的東西),實際上只是給你訪問對象和函數以及它們的屬性。沒有辦法說「從這裏給我n-1運行時範圍內的xVar意味着什麼」。

0

在您的示例XVAR變量不是封閉的,因爲你重新定義其範圍,以每個功能。要將該變量用作閉包,請繼續在closure()函數中用var命令聲明它,然後不要在func1()函數中用var函數聲明它。相反,只需在func1()中立即使用該變量。

有沒有簡單的方法來測試函數是閉包還是局部變量。您將不得不執行某種流量控制測試,然後分析分配,分配發生的位置以及分配不發生的位置。然後你必須比較這些結果。您可以使用JavaScript編寫一個工具,根據給定的輸入執行分析,併爲您輸出報告。

+3

我認爲他知道這一點。問題是,從「func1」中的代碼中,你將如何顯式引用在「closure」中定義的「xVar」(而不是「func1」中定義的「xVar」)? – Pointy 2010-02-27 15:37:24

+0

我在第一段中回答了這個問題。 – 2010-02-27 15:58:57

1

內部作用域中定義的變量隱藏外部作用域中的變量聲明。 「更好和整潔的解決方案」不是以這種方式重用變量名稱。