我試圖尋找在ES6自己的草稿,但我不知道在哪裏看:`this`在全球範圍內ECMAScript中6
誰能告訴我,如果this
在ES6不一定指的是全球目的?此外,該對象是否與全局範圍具有相同的成員?
如果你可以回答ES5,那也是有幫助的。
我知道全局範圍內的this
指的是瀏覽器和大多數其他ES環境(如Node)中的全局對象。我只是想知道這是規範定義的行爲,還是實現者添加的擴展行爲(如果這種行爲將在ES6實現中繼續)。另外,全局對象與全局範圍始終是一回事嗎?還是有區別?
更新 - 爲什麼我想知道:我基本上是試圖找出如何讓全局對象可靠地ES5 & 6.我不能依靠window
,因爲這是特定於瀏覽器,我也不能依靠global
,因爲它特定於像Node這樣的環境。我知道Node中的this
可以參考模塊範圍中的module
,但我認爲它在全球範圍內仍然指global
。我想要一個跨環境的兼容方式來獲取全局對象(如果可能的話)。似乎在全球範圍內所有我知道的this
的環境中都這樣做,但我想知道它是否是實際規範的一部分(並且在我可能不熟悉的任何環境中如此可靠)。
我還需要知道規範中的全局範圍和全局對象是否是相同的東西。換句話說,全球範圍內的所有變量都與globalobject.variable_name
相同?
更新2 - 我想要做的事:
我已經開發了一些ES6 shims for ES5 environments。我想知道最好的方法來(1)檢查ES6內置插件是否已經存在,以便在可能的情況下使用它們而不是我的墊片,以及(2)如果內置插件可以添加墊片到全局範圍,還不存在。
目前我下面這個模式:
(function() {
// Indirect eval to run in global scope.
// (We get whatever "this" is in global scope, hoping that it's the global object...
// Whether this line does what I want it to is the crux of my question.)
var global = (0, eval)('this');
// If Symbol does not already exist in global scope,
if (!global.Symbol)
// Then add Symbol to global scope.
global.Symbol = (function() {
// ...
// Return my Symbol shim
})();
})();
還有一些其他的可能性(1),但在這一天,我需要一種方法來添加一些全局範圍內沒有使用var
結束全球範圍內(因爲這會覆蓋內置,因爲我可以檢查他們,由於var
提升[至少在天真的情況下,也許我可以間接eval
和var
聲明以及?])。我希望我的代碼能夠在嚴格模式下運行,這樣就可以解決問題。
我發現,通過ES5規範,間接eval
在全局範圍內執行代碼。所以我至少能夠做到這一點。我的問題是,如果我在全局範圍內得到this
,(1)檢查該對象的屬性是否讓我知道全局範圍內是否已經存在內置?和(2)將添加屬性到該對象允許我將變量添加到全局範圍?
它應該像以前的ES規格一樣工作,因爲'this'不是ES6特有的。 「this」的含義取決於它的用途,並不總是全局對象。 – Jay
瞭解;這就是爲什麼我要求「在全局範圍內」,瀏覽器中的這個「和」window也是全局對象。但是,我不知道這是在ES中指定的還是僅僅是該語言的瀏覽器擴展。 –
只要你不喜歡SES,間接評估技巧將可靠地工作。一旦你擁有全局對象,你可以分配給它並檢查屬性,這將做你想要的。在es6中,除了Andreas關於let,const等的說法之外,還有一些模塊具有自己的全局私有的全局對象作爲外部作用域,因此除非直接引用外部全局對象,否則無法訪問或修改外部全局對象(像node.js自動定義'global',例如,會給你一個對外部全局的引用)。 – 2012-11-19 04:59:28