Різниця між (1,eval)
простим і старим eval
полягає в тому, що перше - це цінність, а друге - значення. Це було б більш очевидно, якби це був інший ідентифікатор:
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), але лише дуже навмисно.
Я хочу сказати, що ваше джерело страждає на легку та оборотну інверсію краніо-прямої кишки, і, можливо, ви захочете провести тиждень програмування в Хаскелі.