在未知主機環境中獲得對ES5嚴格模式中的global object的處理的推薦方式?在嚴格模式下在未知環境中獲取對未知環境中的全局對象的引用
ECMAScript不提供引用我意識到的全局對象的內置方法。如果是這樣,這是我正在尋找的答案。
在已知環境中,全局對象通常具有自引用屬性。由於全局對象是VO全球範圍內,全局對象的屬性是全局變量,所以我們可以利用它們從任何地方得到一個處理全局對象:
在Web瀏覽器,就可以使用
window
或self
。在node.js中,我們可以使用
global
。
但是,在所有主機環境中情況並非一定如此。據我所知,Windows Script Host不提供任何方法來訪問全局對象。在WSH中獲取全局對象的建議方法似乎是在不解析對象的上下文中使用this
關鍵字。例如:
var GLOBAL = (function(){return this}());
這種技術適用於任何主機環境中工作,而不是在嚴格模式下,因爲一個未定義this
不引用strict mode全局對象:
如果這是在嚴格的評估模式代碼,那麼這個值不會被強制轉換爲對象。 null或未定義的此值不會轉換爲全局對象並且原始值不會轉換爲包裝對象。通過函數調用傳遞的值(包括使用Function.prototype.apply和Function.prototype.call調用的函數)不會強制將此值傳遞給對象(10.4.3,11.1.1,15.3.4.3,15.3。 4.4)。
正如預期的那樣,下面的代碼會導致undefined
:
(function(){
"use strict";
var GLOBAL = (function(){return this}());
console.log(GLOBAL);
}());
那麼,什麼是正確的方式得到一個處理全局對象在任何環境下,無論嚴格模式?
順便說一句,我目前的做法是嗅探全局變量引用全局對象是這樣的:
var self, window, global = global || window || self;
...,然後只用global
。我認爲這是一個不好的解決方案,其原因很多,其中大部分都很明顯,並沒有解決WSH問題。
你不能''嚴格使用'; (function(global){})(this)'? (我沒有測試這個)。 – Marshall 2012-03-10 00:50:16
在Node.js中起作用,至少,@Marshall – 2012-03-10 01:17:48
@DavidEllis woops,這是我選擇的平臺O_o我想我應該在我說什麼之前在別人檢查它; – Marshall 2012-03-10 01:27:19