Как назначить чтение корневого 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.)