Как получить глобальный объект в JavaScript?

Я хочу зарегистрироваться в сценарии, если определенный другой модуль уже загружается.

if (ModuleName) {
    // extend this module
}

Но если ModuleName не существует, это throws.

Если я знал что Global Object я был, мог использовать это.

if (window.ModuleName) {
    // extend this module
}

Но так как я хочу, чтобы мой модуль работал с обоими браузерами и node, rhino, и т.д. я не могу принять window.

Насколько я понимаю это не работает в ES 5 с "use strict";

var MyGLOBAL = (function () {return this;}()); // MyGlobal becomes null

Это также перестанет работать с вызванной исключительной ситуацией

var MyGLOBAL = window || GLOBAL

Таким образом, кажется, что со мной оставляют

try {
    // Extend ModuleName
} 
catch(ignore) {
}

Ни один из этих случаев не передаст JSLint.

Я пропускаю что-нибудь?

74
задан Qantas 94 Heavy 18 December 2013 в 07:48
поделиться

2 ответа

Ну, вы можете использовать оператор typeof, и если идентификатор не существует ни в одном месте цепочки областей, он not выдаст ReferenceError, он просто вернет "undefined":

if (typeof ModuleName != 'undefined') {
  //...
}

Помните также, что значение this в Глобальном коде, относится к глобальному объекту, Это означает, что если ваше утверждение if находится в глобальном контексте, вы можете просто проверить это. Имя_модуля.

О (функция () { вернуть это; } ()); техника, вы правы, в строгом режиме это значение будет просто неопределенным.

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

  • Через конструктор Function:

    var global = Function('return this')();
    

Функции, созданные с помощью конструктора Function, не наследуют строгость вызывающего объекта, они являются строгими только в том случае, если они начинают свое тело с директивы 'use strict', в противном случае они не являются строгими.

Этот метод совместим с любой реализацией ES3.

  • Через косвенный eval вызов, например:

    "use strict";
    var get = eval;
    var global = get("this");
    

Вышесказанное будет работать, потому что в ES5 косвенные вызовы eval используют глобальную среду как переменную среду и лексическую среду для кода eval.

Подробнее см. раздел Ввод кода Eval, шаг 1.

Но имейте в виду, что последнее решение не будет работать на реализациях ES3, потому что косвенный вызов eval на ES3 будет использовать переменные и лексические среды вызывающего объекта в качестве сред для самого кода eval.

И, наконец, Возможно, вам будет полезно определить, поддерживается ли строгий режим:

var isStrictSupported = (function () { "use strict"; return !this; })();
91
ответ дан 24 November 2019 в 12:00
поделиться

Здесь вы идете :)

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

Это должно работать из любого места, например, из другого закрытия.

Редактировать - просто прочитайте свой пост внимательнее и увидели часть про строгий режим ES5. Может ли кто-нибудь пролить больше света на это? Это был принятый способ получить глобальный объект столько, сколько я себя помню... Я надеюсь, что он не сломается.

Правка 2 - Ответ CMS содержит больше информации о строгом режиме ES5 это.

2
ответ дан 24 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: