JavaScript - проверить, если в глобальном контексте - PullRequest
6 голосов
/ 20 декабря 2008

Когда функция присоединяется к объекту и вызывается:

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(); }

Примечание: здесь я не имею в виду конкретный вариант использования - на самом деле я спрашиваю об этом точном механизме.

Ответы [ 3 ]

10 голосов
/ 22 декабря 2008

Ниже должно работать, так как использование Function.call со значением null вызовет его в глобальной области видимости.

this === ((function () { return this; }).call(null))

Более простой вариант,

this === (function () { return this; })()

также будет работать, но я думаю, что первое проясняет намерение.

8 голосов
/ 20 декабря 2008

Глобальный объект на самом деле является окном, поэтому вы можете сделать

if (this === window)
1 голос
/ 21 декабря 2008

Ответ Роборга концептуально верен - за исключением того, что window доступен только в контексте основного потока браузеров (так что это обязательно исключает рабочие потоки и тому подобное, а также любой JS, не размещенный в браузере, который получает меньше и менее необычно).

Ваша самая безопасная ставка в основном соответствует той, что была у вас выше, но вы должны использовать var и ===, поскольку переводчик может оптимизировать такой доступ более полно.

...