JavaScript - проверьте, находится ли в глобальном контексте
-
23-08-2019 - |
Вопрос
Когда функция присоединяется к объекту и вызывается:
function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20
this
ссылается на объект, для которого функция была вызвана как метод.Это равносильно тому, чтобы делать f.call(o)
.
Когда функция вызывается не как часть объекта, this
ссылается на глобальный объект.Как мне проверить, вызывается ли функция из необъектного контекста?Существует ли какое-либо стандартное ключевое слово для доступа к глобальному объекту?Это единственный способ сделать это примерно так?
globalobj = this;
function f() { if (this == globalobj) doSomething(); }
Примечание:Я здесь не имею в виду никакого конкретного варианта использования - на самом деле я спрашиваю именно об этом механизме.
Решение
Глобальный объект на самом деле является окном, поэтому вы можете сделать
if (this === window)
Другие советы
Приведенное ниже должно сработать, поскольку использование Function.call со значением null вызовет его в глобальной области видимости.
this === ((function () { return this; }).call(null))
Более простой вариант,
this === (function () { return this; })()
тоже сработает, но я думаю, что первое делает намерение более ясным.
Ответ Роборга концептуально верен - за исключением window
доступен только в контексте основного потока браузера (так что это обязательно исключает рабочие потоки и т.п., а также любой JS, размещенный не в браузере, который становится все менее и менее необычным).
Ваша самая безопасная ставка - это в основном то, что вы указали выше, но вы должны использовать var
и ===
поскольку интерпретатор может более полно оптимизировать такие обращения.