2016-02-24 158 views
0

[更新]我得到確認,我不能這樣做。JS範圍訪問


所有:

我非常新的JS範圍,說我有一個函數定義爲:

var scope = "scope inside global"; 
function out(){ 

    var scope = "scope inside out"; 

    function scopeaccess(){ 
     console.log(scope); 
    } 

    scopeaccess(); 
    return scopeaccess; 
} 
var sa = out(); 
sa(); 

輸出都爲「範圍內而外」,我想知道我可以在範圍內訪問「全球範圍內的範圍」嗎?或者我只想確認沒有辦法做到這一點。

感謝

+2

[...]等待。這個評論應該是一個答案。 – Bergi

+0

@Bergi謝謝,只是想確認一下。 – Kuan

+1

雖然在一般情況下給出的答案是正確的,但在某些情況下,包含外部變量的作用域可能會以其他方式捕獲。例如,如果這是直接作爲瀏覽器中的腳本運行的,那麼外層'scope'可以作爲'window.scope'訪問,因爲頂層範圍實際上是'window'對象。依靠這個IMO是不好的做法。 –

回答

2

我不知道如何可以訪問 「內部全局範圍」 的scopeacess?

根本不能。您需要爲本地var scope使用不同的變量名稱,以便您可以訪問全局變量scope。當然,你也可以通過混淆全局變量或通過明確地傳遞它的值來解決這個問題,以便通過除變量scope之外的其他方法來訪問它。

在您的示例中,名稱可能僅用於演示發生了什麼(閉包在詞法上不是動態範圍的),但在實際腳本中,您不需要shadow變量(或只是錯誤)。

+0

謝謝,看來我必須顯式傳遞變量作爲參數,而不是在外部引用它。 – Kuan

+0

@Kuan - 或者給他們不同的變量名稱。隱藏更高範圍的變量是名稱衝突。 – jfriend00

+0

您可能會提到全局變量可用作全局對象的命名屬性。在一個瀏覽器中,將會是* window.scope *(在這種情況下),在非瀏覽器主機(或那些沒有* window *)的情況下,訪問全局對象需要更多的工作,但'var global =(function() {return this}())'在非嚴格模式下工作。 – RobG