Разница между (1,eval)и простым старым evalсостоит в том, что первое - это значение, а второе - lvalue. Было бы более очевидно, если бы это был какой-то другой идентификатор:
var x;
x = 1;
(1, x) = 1;
Это (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
РЕДАКТИРОВАТЬ
После дополнительных экспериментов я временно скажу, что thisнельзя установить на nullили undefined. Он может быть установлен на другие ложные значения (0, '', NaN, false), но только очень намеренно.
Я собираюсь сказать, что ваш источник страдает легкой и обратимой кранио-ректальной инверсией и может подумать о том, чтобы потратить неделю на программирование на Haskell.