2014-02-19 94 views
0

JavaScript全局對象和窗口對象之間有什麼區別?我知道在這兩種情況下,你不必聲明對象使用這些方法。全局和窗口對象的區別

+0

你必須聲明它們使用它們,這只是他們自動爲您和Window.prototype宣稱,像所有的原型,使修改立即提供給所有實例。 – dandavis

+0

你在談論瀏覽器JS嗎?你可以在服務器上運行JS。那裏沒有'窗口'。我想,瀏覽器沒有'global'。 – Rudie

+0

有幾個「Globals」;非嚴格的this,window,self,top,implicit publishing(非var聲明),({})。constructor.prototype,Window.prototype,Object.prototype等。其中之一的任何添加都會顯示爲詞法所有範圍內的名稱。 「嚴格使用」大大減少,但並沒有消除這種瘋狂。 – dandavis

回答

0

我可能是錯的,但在我看來,所謂的全局變量是在窗口對象下定義的。

+0

在大多數瀏覽器中是這樣的... – dandavis

+0

你知道哪些瀏覽器是例外嗎?我現在很好奇。我偶爾嘗試通過窗口對象訪問全局變量。 – Hans

+0

我認爲我們都可以猜出哪一個,但它與「dry heave」押韻並且不支持「real」js,直到它成爲第九個版本。 – dandavis

1

window對象封裝了全局範圍。當聲明一個變量時,省略var(或let)將隱式地將其作爲屬性添加到全局範圍。它在這個意義上是獨一無二的,因爲在不同範圍內不存在與window等價的等價物。

我要quote myself在這一個:

MDN's description of var指出,在全球範圍內被綁定到全局對象。這表明聲明一個變量(或者在頂層使用var,或者在函數內部沒有使用var)只需向window(或者瀏覽器外部的一個等價物)添加一個新的屬性即可。

試一試。創建一個變量而不使用var,然後查看控制檯中的window對象。你會在那裏看到它。它是這樣做的相當於:

Object.defineProperty(window, 'foo', { 
value: "bar", 
enumerable: true // see @dandavis' comment on iterating over implicit global vars 
)} 

這並不能解釋爲什麼是這種情況。只有window是獨一無二的,因爲所有內容都在其中定義。

+0

默認情況下,enumerable爲false,但隱式全局變量在窗口下可迭代。 – dandavis

+0

「全球」呢? – Rudie

+0

我認爲'全球'可能意味着更多的是一個概念,而不是一個特定的對象。在nodejs中,沒有像瀏覽器的「Window」那樣的「Global」,但是節點的'global'提供了粗略的等價物,它的global.constructor.prototype === Object.prototype,而window.constructor.prototype!== Object。原型 – dandavis

0

在瀏覽器中運行的JavaScript中,窗口位於作用域鏈的頂部。如果你定義了一個「全局」變量,則暗示它在窗口對象下。

例如:

// Global variable 
var g = 0; 

function foo(){ 
    window.g = 1 

    // This will output '1' 
    alert(g); 
} 
+0

深思熟慮:如果「窗口位於範圍鏈的頂部」,爲什麼它繼承自Object.prototype和Window.prototype? – dandavis