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

StackOverflow https://stackoverflow.com//questions/9642491

Вопрос

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

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

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

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

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

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

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

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

    Если это оценивается в строгом коде режима, то это значение не принуждено к объекту. Это значение NULL или undefined не преобразуется в глобальный объект и примитивные значения не преобразуются в объекты обертки. Это значение прошло через вызов функции (включая вызовы, выполненные с использованием функции .Prototype.apply и Function.prototype.Call) Не принудительно пропускают это значение для объекта (10.4.3, 11.1.1, 15.3.4.3, 15,3. 4.4).

    Как и ожидалось, следующий код приводит к генеракодичеству:

    (function(){
        "use strict";
        var GLOBAL = (function(){return this}());
        console.log(GLOBAL);
    }());
    
    .


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

    Кстати, мой текущий подход - это нюхать для глобальных переменных, ссылающихся на глобальный объект, как это:

    var self, window, global = global || window || self;
    
    .

    ... а затем просто используйте this. Я думаю, что это плохое решение по ряду причин, большинство из которых являются довольно очевидными, и это не устраняет проблему WSH.

Это было полезно?

Решение

In ES5, you can get a reference to global object from within strict mode via indirect eval call:

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

Take a look at my article; particularly at this section on strict mode.

Другие советы

In global code, the thisBinding is set to the global object regardless of strict mode. That means you can pass it from there into your module IEFE:

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));

In strict mode, the way to get a reference to the global object is to assign a variable in the global object referencing itself.

That is this means the global object when in the global context, so the solution is simply:

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

This does mean that you have to pollute the global namespace with a reference to itself, but like you say, it should already have been there.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top