Разница между (1,eval)
и простым старым eval
заключается в том, что первое значение равно , а второе - lvalue. Это было бы более очевидно, если бы это был какой-то другой идентификатор:
var x;
x = 1;
(1, x) = 1; // syntax error, of course!
То есть (1,eval)
- это выражение, которое дает eval
(как, скажем, (true && eval)
или (0 ? 0 : eval)
), но это не ссылка на eval
.
Почему тебя это волнует?
Ну, спецификация Ecma рассматривает ссылку - eval
как "прямой вызов eval", но выражение, которое просто возвращает eval
как косвенный - и косвенные вызовы eval гарантированно выполняется в глобальном масштабе.
Вещи, которые я до сих пор не знаю:
- При каких обстоятельствах прямой вызов eval не выполняется в глобальной области видимости?
- При каких обстоятельствах
this
функции в глобальной области видимости не может привести к глобальному объекту?
Дополнительную информацию можно получить здесь .
РЕДАКТИРОВАТЬ
По-видимому, ответ на мой первый вопрос "почти всегда". Прямое eval
выполняется из текущей области. Рассмотрим следующий код:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Не удивительно (хе-хе), это печатает:
direct call: inner
indirect call: outer
EDIT
После дальнейших экспериментов я временно скажу, что this
нельзя установить на null
или undefined
. Можно установить другие ложные значения (0, '', NaN, false), но только очень сознательно.
Я хочу сказать, что ваш источник страдает от легкой и обратимой кранио-ректальной инверсии и может подумать о том, чтобы потратить неделю на программирование в Haskell.