Каков рекомендуемый способ получить дескриптор глобального объекта в строгом режиме ES5 в неизвестной среде хоста ?
ECMAScript не предоставляетвстроенный способ ссылки на глобальный объект, который я знаю.Если да, то это ответ, который я ищу.
В известной среде глобальный объект обычно обладает свойством самоссылки.Поскольку глобальный объект является VO для глобальной области видимости, свойства глобального объекта являются глобальными переменными, поэтому мы можем использовать их, чтобы получить указатель на глобальный объект из любого места:
Однако это не обязательно имеет место во всех средах хоста.Насколько я знаю, Windows Script Host не предоставляет никакого способа доступа к глобальному объекту.Рекомендуемый способ получения глобального объекта в WSH, по-видимому, заключается в использовании ключевого слова this
в контексте, где оно не разрешается для объекта.Например:
var GLOBAL = (function(){return this}());
Этот метод будет работать для любой среды хоста, но не в строгом режиме, поскольку неопределенный this
не ссылается на глобальный объект в строгом режиме :
Если это вычисляется в коде строгого режима, то это значение не приводится к объекту. A Это значение с нулевым или неопределенным значением не преобразуется в глобальный объект , а примитивные значения не преобразуются в объекты-оболочки.Значение 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.