全局變量是否存儲在特定對象中?例如:Javascript全局變量存儲在哪個對象中?
var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
所有這些測試三個導致undefined
,所以是有保存這些變量的對象?
我感覺好像這是我應該已經知道的一些愚蠢的東西,但我甚至無法在網上找到答案。
全局變量是否存儲在特定對象中?例如:Javascript全局變量存儲在哪個對象中?
var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
所有這些測試三個導致undefined
,所以是有保存這些變量的對象?
我感覺好像這是我應該已經知道的一些愚蠢的東西,但我甚至無法在網上找到答案。
我想你會發現在大多數瀏覽器上,他們都是存儲在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>
果然,「東西」每次。
我知道有一個原因,我認爲「這是愚蠢的,我應該已經知道」。你是完全正確的,我正在使用jsFiddle ......感謝指向我自己愚蠢的方向。哈哈 – twiz 2012-07-20 04:44:37
不是愚蠢的,這是一個很好的問題。 – 2012-07-20 04:52:37
我與雷;這絕對是一個很好的問題。事實上,我認爲這個答案實際上是對的,我覺得有點奇怪。 – 2012-07-20 04:54:14
「true」全局變量沒有「var」關鍵字。 試試這個:
test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
有了這個,所有範圍會看到它。 var關鍵字的變量是聲明範圍的局部變量。
只有當您在Dan所說的窗口範圍中聲明它時,變量纔會是「全局窗口」(窗口對象的屬性),這對於通常使用窗口作爲全局範圍的瀏覽器來說是全局的。
「真正的」全球?如果你在全局範圍使用'var',它會產生一個全局變量。 – nnnnnn 2012-07-20 04:50:58
@nnnnnn使用雙引號是故意的;) – davidbuzatto 2012-07-20 04:54:53
有趣。我在jsfiddle中嘗試了這個,而我取而代之的是「東西」,「未定義」,「東西」。而第一個和最後一個是相同的,因爲這個===窗口。 HTTP://的jsfiddle。net/5Xtaq/1/ – 2014-05-25 03:03:08
全局變量存儲在全局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
}
這是'var'關鍵字,[@davidbuzatto](http://stackoverflow.com/a/11573012/143295)有一個很好的眼睛。 – Nicole 2012-07-20 04:50:25
這是一個晚,但技術的答案。
你問
存儲在特定對象的全局變量?
答案是肯定的;它們被存儲在一個叫做的全局對象。該對象在official ECMAScript 5 Specification的第15.1節中描述。
全局對象不需要有名稱;但您可以簡單地使用它們的名稱來引用其屬性,例如String
,isNaN
和Date
。除了ECMAScript規範要求的全局對象之外,您的JavaScript宿主環境還會將其他屬性放在全局對象中,例如alert
或console
。在瀏覽器中,我可以寫劇本
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
警告。
簡答:您如何引用全局變量取決於您的環境。 – 2012-07-20 04:38:53
「環境」是什麼意思?瀏覽器,範圍,操作系統? – twiz 2012-07-20 04:41:13
JavaScript可以在瀏覽器,Adobe Photoshop,舊VRML瀏覽器,可以嵌入Java程序和許多其他主機系統的引擎中運行。我們稱之爲「主機環境」。所以是的,它可能是一個瀏覽器。 JavaScript程序處理來自這些環境的對象。 – 2012-07-20 04:44:12