2014-07-02 99 views
1

我知道這可能聽起來很基本,但忍受着我。我很好奇窗口對象的低層功能和意圖。Javascript「窗口」:它的目的是什麼?它有什麼作用?

javascript窗口對象的目的是什麼?它的核心功能是什麼?我知道一切都存儲在瀏覽器的窗口中。 SpiderMonkey(https://en.wikipedia.org/wiki/Mozilla#SpiderMonkey)沒有默認定義的窗口,所以它必須是瀏覽器對象。

它的用途是什麼?

+2

東西必須在路的盡頭......窗口是瀏覽器的東西,但幾乎所有的運行時都爲全局對象提供了一個類似的別名。 – dandavis

+2

有人應該爲這個問題做一個好的2班輪。 – frenchie

+1

爲什麼瀏覽器工具(open(),prompt()等)無法從window.browser移出,或者導航器等現有名稱是歷史問題。考慮到早期網絡的匆忙,很可能原本沒有一個完美的設計和計劃。 – dandavis

回答

2

窗口是在任何瀏覽器的應用程序在全球範圍內。您的代碼從窗口運行。當您在瀏覽器中打開JavaScript控制檯並開始編碼時,您正在從窗口範圍開始工作。這就是說,這只是被稱爲封閉範圍的冰山一角。你調用的每個函數都有它自己的閉包(閉包對於函數代碼運行的環境來說只是一個奇特的詞)。從窗口調用的兩個函數將無法訪問其他每個閉包,但是它們將有權訪問其父範圍,在這種情況下,該窗口。例如:

var x = 'hello' // saves 'hello' as variable x in window/ global scope 
var greeting = function(){ 
    console.log(x); 
    var y = ' world'; // stores ' world' as y in greeting closure scope 
} 

var toGreet = function(){ 
    console.log(y); 
} 

greeting(); // logs 'Hello', stores ' world' as variable y in greeting closure scope 
toGreet(); // Errors, because y is undefined. toGreet does not have access to greetings closure scope 

如果有要跨範圍共享變量或常數(或任何值,對於這個問題),可以在window--定義變量,那麼您可以從訪問這些值任何功能。喜歡這個!

變種X =「你好」 變種Y =「世界」

var greeting = function(){ 
    console.log(x); 
} 

var toGreet = function(){ 
    console.log(y); 
} 

greeting(); // logs 'Hello' 
toGreet(); // logs ' world' 

不幸的是,範圍概念已經比這更深,但是這應該給你的窗口是什麼好主意。 ..只是旁白:通常最好不要將變量保存在窗口中,因爲您可能會意外地在一個函數中改變它們,但在另一個函數中需要它們。在函數之間共享變量的最佳方式是將其作爲參數傳遞給函數。

如果您想了解更多關於範圍和關閉的信息,請查看this blog

+0

我瞭解範圍是什麼。所以基本上,這只是瀏覽器工作的範圍? – cxdf

+0

哦,真棒。是的,你可以這樣看待它。窗口只是整個程序運行的總體範圍。 – Mercury

+0

正是我在找的東西。 – cxdf

0

當您爲網頁進行客戶端編程時,window對象是一個特殊的對象,它也恰好是JavaScript執行的全局範圍。

  • 需要訪問HTML DOM?使用window.document
  • 需要了解當前的URL還是想來回導航?使用window.locationwindow.history
  • 需要了解有關正在使用的網絡瀏覽器的信息?使用window.navigator
  • 等...

同樣,還有的屬性,方法,事件多如牛毛,而對象則可以通過window對象訪問。下面是一些參考:

+0

你可以使用Object.getOwnPropertyNames(window)查看給定瀏覽器的全部內容;即使在about:blank左邊,窗口在Chrome和Firefox中定義了500多個屬性,在IE 10中定義了300多個屬性。其中幾十個實際上對於製作應用程序非常有用。 – dandavis

+0

'「有必要訪問你正在嘗試使用JavaScript編程的頁面,窗口對象就是那個」'。並非如此,「頁面」由* document * object(* cf * DOM)表示,與* window *完全不同。 – RobG

+0

@RobG:注意謝謝。我寫了答案對新手JavaScript程序員有幫助。我已經更新了答案。 – Krumia

相關問題