Разница между (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.