2014-09-12 39 views
2

在ECMAScript 5及更低版本中,腳本頂層的var聲明成爲全局對象,也就是說,全局對象的屬性(瀏覽器中的window)。在ECMAScript 6中,我們現在有模塊。模塊處於嚴格模式,所以我們不會通過忘記var來自動創建全局,但是如果我在模塊的頂層聲明var,它是否會成爲window對象的全局屬性?如果我使用letconst或ES6中添加的任何新聲明表單怎麼辦?變量聲明是否成爲ecmascript 6模塊中窗口的屬性?

var foo = {}; 
console.log(window.foo === foo); // true or false? 

let bar = {}; 
console.log(window.bar === bar); // what about this? 
+0

@Bergi:我不認爲這是重複的。這個問題在腳本上下文中詢問「let」。這個問題在模塊上下文中詢問'var'。 – 2015-12-14 16:38:04

+0

有沒有一種有用的方法可以編輯這個問題來調出區別?我覺得不適合在「MODULE上下文」中添加「note,VAR」(或者其他),因爲這基本上只是對版主有點粗魯。但我不確定如何澄清這種區別,使其自然成爲問題的一部分。 – 2015-12-14 16:53:55

+1

這看起來更接近於一個重複:http://stackoverflow.com/questions/32961255/is-there-an-es6-module-scope-equivalent-to-window?rq=1雖然有細微的差異。 (我問他們是否繼續使用'window';這個問題是詢問模塊是否有'window'這樣的_something_,兩者的答案都是一樣的。) – 2015-12-14 17:02:31

回答

2

,但如果我在一個模塊的頂層聲明一個變種,它成爲窗口對象的全局屬性?如果我使用let或const或es6中添加的任何新聲明表單怎麼辦?

兩種情況的答案都是否定的。創建全局屬性(如果CanDeclareGlobalVar返回true)僅適用於腳本(部分15.1.8)的聲明。但模塊內的VarDeclaredNamesVarScopedDeclarations屬於該模塊(準確地說是ModuleItem) - 而不是整個腳本。不然的話,在模塊中封裝數據的全部想法(以便每個模塊通過已建立的export/import例程與其餘應用程序進行通信)將會被浪費。

+1

我無法理解規範,我沒有看到它在15.1.8中檢查腳本和模塊的位置。我想我需要先升級。你簡單的英語「如果它,模塊將毫無價值」,但很有意義。 – 2014-09-12 20:22:32