JavaScript - проверьте, находится ли в глобальном контексте

StackOverflow https://stackoverflow.com/questions/383185

  •  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 и === поскольку интерпретатор может более полно оптимизировать такие обращения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top