Подтвердить что ты не робот

Верните это || (0, Eval) ('this');

Глядя на источник doT.js:

https://raw.github.com/olado/doT/master/doT.js

Что это делает?

(function(){ return this || (0,eval)('this'); }()).doT = doT;

Мне кажется, что он создает глобальный var, window.doT. Если это все, что он делает, то почему бы и нет:

window.doT = doT;

?

4b9b3361

Ответ 1

Получает ссылку на глобальный объект, чтобы присвоить ему doT. Обычно это делается потому, что с помощью библиотеки JavaScript/framework/etc, его один глобальный идентификатор должен быть открыт для внешнего мира.

Что касается того, почему это не просто window.doT = doT;, это потому, что глобальный объект не всегда window, например, в среде без браузера. Также возможно иметь window, назначенный где-то еще в точке, в которой этот код выполнен.

Как это работает

Если this уже правдивый, например, такой объект, как window, он вернет это. Вероятно, это будет window (по крайней мере, в браузере), так как обычный вызов функции должен иметь свой ThisBinding для глобального объекта. В противном случае он выполнит eval() в глобальной области, потому что косвенный вызов eval() будет определять свою область действия глобально, в отличие от области вызывающей среды.

Чтобы получить косвенный вызов, вы должны косвенно коснуться eval(), т.е. вы не можете просто вызвать его с помощью eval(). Вы можете использовать (0, eval) для его вызова. Это зависит от оператора запятой, возвращающего последнее оцениваемое выражение, в данном случае eval. Не имеет значения, каковы предыдущие операнды. Аналогично, (0||eval)() будет работать.

Как для тела this, то есть аргумент eval(), то есть код, который должен исполняться как строка. Он вернет this в глобальную область, которая всегда является глобальным объектом.

В настоящее время это не актуально, но в старых IE вам нужно использовать execScript() для выполнения кода в глобальной области. Я не могу точно помнить, какие версии IE были необходимы.