Получение ссылки на глобальный объект в неизвестной среде в строгом режиме

Каков рекомендуемый способ получить дескриптор глобального объектав строгом режиме ES5 ] в неизвестной хост-среде?

ECMAScript не предоставляет встроенного способа ссылки на глобальный объект, о котором я знаю. Если это так, это ответ, который я ищу.

В известной средеглобальный объект обычно имеет свойство ссылки на себя.Поскольку глобальный объект является VOдля глобальной области видимости, свойства глобального объекта являются глобальными переменными, поэтому мы можем использовать их для получения дескриптора глобального объекта из любого места:

  • В веб-браузере, мы можем использовать windowили self.

  • В node.js мы можем использовать global.

Однако это не обязательно имеет место во всех хост-средах. Насколько я знаю, Windows Script Host не предоставляет никакого доступа к глобальному объекту. Рекомендуемым способом получения глобального объекта в WSH является использование ключевого слова thisв контексте, где оно не разрешается в объект. Например:

var GLOBAL = (function(){return this}());

Этот метод будет работать для любой хост-среды, но не в строгом режиме, поскольку неопределенный thisне ссылается на глобальный объект в строгом режиме:

Если это оценивается в коде строгого режима, то это значение не приводится к объекту. Это значение null или undefined не преобразуется в глобальный объект, а примитивные значения не преобразуются в объекты-оболочки. Значение this, переданное через вызов функции (включая вызовы, сделанные с использованием Function.prototype.apply и Function.prototype.call), не принуждает переданное значение this к объекту (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.

22
задан Dagg Nabbit 9 March 2012 в 23:46
поделиться