Я хочу зарегистрироваться в сценарии, если определенный другой модуль уже загружается.
if (ModuleName) {
// extend this module
}
Но если ModuleName
не существует, это throw
s.
Если я знал что 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.
Я пропускаю что-нибудь?
Ну, вы можете использовать оператор 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; })();
Здесь вы идете :)
var globalObject = (function(){return this;})();
Это должно работать из любого места, например, из другого закрытия.
Редактировать - просто прочитайте свой пост внимательнее и увидели часть про строгий режим ES5. Может ли кто-нибудь пролить больше света на это? Это был принятый способ получить глобальный объект столько, сколько я себя помню... Я надеюсь, что он не сломается.
Правка 2 - Ответ CMS содержит больше информации о строгом режиме ES5 это
.