Ответ 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 были необходимы.