Как назначить чтение корневого var в JS независимо от контекста (Browser, Node)?

У меня есть функция, которая назначает объект в пользовательское пространство имен, без перезаписи существующих объектов в пути, немного похоже mkdir -p, например:

assignObjectToNamespace(myObj, "com.stackru.questions.root", window)

Прототип будет что-то вроде:

assignObjectToNamespace(object, namespace, target)

Итак, вы создаете namespace на target и назначить object к этому. Очевидно, если com.stackru уже существует на target Вы не хотите перезаписывать это / инициализировать это.

Этот метод будет использоваться в основном в контексте браузера, поэтому вместо передачи window в качестве цели я хотел бы target быть необязательным, и по умолчанию для корневого элемента.

Где-то в реализации у меня есть:

if(!target) return
var recursiveElement = target

а потом recursiveElement будет назначен второму объекту в пространстве имен, третьему и так далее, и так далее, пока не будет больше . отдельные элементы в пространстве имен.

Если я хочу изменить код на

var recursive element = target || root

Что должно root быть?

Причина, по которой мы не по умолчанию root в window сделать эту библиотеку немного более общей и избежать привязки к контексту браузера. Я знаю, что это не важная вещь, но вместо того, чтобы просто изменить код, чтобы адаптировать его или просто отказаться и сделать третий аргумент обязательным, я хотел знать, есть ли какая-то странность, о которой я не знаю.

1 ответ

Решение

Когда не в контексте браузера обычно называется корневой контекст global так что вы можете использовать это.

Так что вы могли бы сделать:

var context = typeof window === 'undefined' ? global:window;

Или более обобщенно - без ссылок global или же window:

var customGlobalContext;
(function() { customGlobalContext = this; }).call(null);

Последний работает, потому что любой метод выполняется без контекста (просто f() или же f.call(null)) будет выполняться в глобальном контексте, и this будет ссылаться на это.

Обновить

Хотя первый подход все еще хорош, второй может столкнуться с проблемами в strict mode,

После комментария @ Берги я прочитал this интересная статья, которая объясняет плюсы и минусы this ключевое слово.

После этого, я бы сказал, чтобы получить global контекст, иметь эту строку в корне файла (поэтому не обернут ни в один метод / function):

var customGlobalContext = this;

В этом случае this будет ссылаться на глобальный контекст, где бы вы ни находились (nodejs/window/etc.)

Другие вопросы по тегам