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

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

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

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

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

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

Однако это не обязательно имеет место во всех средах хоста.Насколько я знаю, 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.

Ответы [ 3 ]

30 голосов
/ 10 марта 2012

В ES5 вы можете получить ссылку на глобальный объект в строгом режиме с помощью косвенного вызова eval:

"use strict";
var global = (1,eval)('this');

Взгляните на my article ;особенно в этом разделе в строгом режиме .

7 голосов
/ 04 июня 2013

В глобальном коде , thisBinding устанавливается для глобального объекта независимо от строгого режима. Это означает, что вы можете передать его оттуда в свой модуль IEFE:

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));
1 голос
/ 10 марта 2012

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

То есть this означает глобальный объект в глобальном контексте , поэтому решение просто:

"use strict";
var global = global || this;
(function() { global.hello = "world"; })();
console.log(hello); // Outputs 'world' as expected

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 * * * * * * * * * * за 100%.

...