2012-07-20 59 views
14

全局變量是否存儲在特定對象中?例如:Javascript全局變量存儲在哪個對象中?

var test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 

所有這些測試三個導致undefined,所以是有保存這些變量的對象?

我感覺好像這是我應該已經知道的一些愚蠢的東西,但我甚至無法在網上找到答案。

+3

簡答:您如何引用全局變量取決於您的環境。 – 2012-07-20 04:38:53

+1

「環境」是什麼意思?瀏覽器,範圍,操作系統? – twiz 2012-07-20 04:41:13

+0

JavaScript可以在瀏覽器,Adobe Photoshop,舊VRML瀏覽器,可以嵌入Java程序和許多其他主機系統的引擎中運行。我們稱之爲「主機環境」。所以是的,它可能是一個瀏覽器。 JavaScript程序處理來自這些環境的對象。 – 2012-07-20 04:44:12

回答

15

我想你會發現在大多數瀏覽器上,他們都是存儲在window

牽強的心靈調試嘗試:你在jsFiddle中測試過嗎?或者在Firebug中?如果是這樣,你可能會看到undefined所有三個,因爲在這種情況下 代碼在一個框架中執行;所以它有一個不同的 window對象(我認爲) 代碼實際上是包裹:

window.addEvent('load', function() { 
    var test="stuff"; 
    console.log(window.test); 
    console.log(document.test); 
    console.log(this.test); 
}); 

您可以從的jsfiddle上述片段,test一個全局變量,這可以解釋爲什麼它不是招」看已附加到window

我不是專家,但從Chrome,Firefox,Safari和Opera中可以看出,這個答案看起來是準確的。爲了驗證,我創建了以下內容的HTML文件,並在每個瀏覽器加載它:

<script type="text/javascript"> 
    var test = "stuff"; 
    alert(window.test); 
</script> 

果然,「東西」每次。

+0

我知道有一個原因,我認爲「這是愚蠢的,我應該已經知道」。你是完全正確的,我正在使用jsFiddle ......感謝指向我自己愚蠢的方向。哈哈 – twiz 2012-07-20 04:44:37

+3

不是愚蠢的,這是一個很好的問題。 – 2012-07-20 04:52:37

+0

我與雷;這絕對是一個很好的問題。事實上,我認爲這個答案實際上是對的,我覺得有點奇怪。 – 2012-07-20 04:54:14

5

「true」全局變量沒有「var」關鍵字。 試試這個:

test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 

有了這個,所有範圍會看到它。 var關鍵字的變量是聲明範圍的局部變量。

只有當您在Dan所說的窗口範圍中聲明它時,變量纔會是「全局窗口」(窗口對象的屬性),這對於通常使用窗口作爲全局範圍的瀏覽器來說是全局的。

+1

「真正的」全球?如果你在全局範圍使用'var',它會產生一個全局變量。 – nnnnnn 2012-07-20 04:50:58

+0

@nnnnnn使用雙引號是故意的;) – davidbuzatto 2012-07-20 04:54:53

+0

有趣。我在jsfiddle中嘗試了這個,而我取而代之的是「東西」,「未定義」,「東西」。而第一個和最後一個是相同的,因爲這個===窗口。 HTTP://的jsfiddle。net/5Xtaq/1/ – 2014-05-25 03:03:08

2

全局變量存儲在全局window變量中。下面的代碼工作,如果你只是把它聲明以外的任何東西(如函數):

var test="stuff"; 
console.log(window.test); 

類似的證據是,window.location.href相同location.href

然而,問題可能在於對變量被宣佈在那裏。例如,如果您在聲明函數這個變量,它只會存在於功能,而不是全局:

function foo(){ 

    //declaring inside function 
    var test="stuff"; 

    //undefined, since the variable exists in the function only 
    console.log(window.test); 

    //undefined, document refers to the document 
    //which is the top DOM object, not the global window 
    console.log(document.test); 

    //depends on what "this" refers to, especially 
    //when using call() or apply() to call the function 
    //For normal function calls, usually it points to window as well 
    console.log(this.test); 

    //none of the above refer to "test" that contains "stuff" 
    //because you are looking in the wrong place 

} 
+0

這是'var'關鍵字,[@davidbuzatto](http://stackoverflow.com/a/11573012/143295)有一個很好的眼睛。 – Nicole 2012-07-20 04:50:25

17

這是一個晚,但技術的答案。

你問

存儲在特定對象的全局變量?

答案是肯定的;它們被存儲在一個叫做的全局對象。該對象在official ECMAScript 5 Specification的第15.1節中描述。

全局對象不需要有名稱;但您可以簡單地使用它們的名稱來引用其屬性,例如String,isNaNDate。除了ECMAScript規範要求的全局對象之外,您的JavaScript宿主環境還會將其他屬性放在全局對象中,例如alertconsole。在瀏覽器中,我可以寫劇本

alert("Hello world"); 

因爲alert是全局對象的屬性。

請注意,根本不需要一種方法來訪問這個全局對象,不管你信不信。然而,很酷的事情是,很多主機環境都會在全局對象中放置一個屬性,其值是全局對象本身的引用。在大多數網頁瀏覽器中,這個屬性被稱爲window。因此,我們可以這樣寫:

alert("Hello"); 
window.alert("Hello"); 
window.window.alert("Hello"); 
window.window.window.window.window.alert("Hello"); 

,你也可以說:

var x = 5; 
alert(this.x); 

,並得到5警告。