Różnica między (1,eval)a zwykłym starym evalpolega na tym, że pierwsza jest wartością, a druga jest lwartością. Byłoby bardziej oczywiste, gdyby był to jakiś inny identyfikator:
var x;
x = 1;
(1, x) = 1;
To jest (1,eval)wyrażenie, które daje eval(tak jak powiedzmy (true && eval)lub (0 ? 0 : eval)zrobiłoby), ale nie jest odniesieniem do eval.
Dlaczego się przejmujesz?
Cóż, ECMA specyfikacja rozważa odwołanie się evalbyć „bezpośrednie połączenie eval”, ale to tylko wyraz daje w wyniku evalbyć pośrednim jeden - i pośrednie połączenia eval gwarantowane są do wykonania w zakresie globalnym.
Rzeczy, których nadal nie wiem:
- W jakich okolicznościach bezpośrednie wywołanie eval nie jest wykonywane w zakresie globalnym?
- W jakich okolicznościach
thisfunkcja o zasięgu globalnym może nie dawać obiektu globalnego?
Więcej informacji można znaleźć tutaj .
EDYTOWAĆ
Najwyraźniej odpowiedź na moje pierwsze pytanie brzmi „prawie zawsze”. Bezpośredni jest evalwykonywany z bieżącego zakresu. Rozważ następujący kod:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Nic dziwnego (heh-heh), to wypisuje:
direct call: inner
indirect call: outer
EDYTOWAĆ
Po dalszych eksperymentach zamierzam wstępnie powiedzieć, że thisnie można ustawić na nulllub undefined. Można ustawić inne fałszywe wartości (0, „, NaN, fałsz”), ale tylko bardzo celowo.
Powiem, że twoje źródło cierpi na łagodną i odwracalną inwersję czaszkowo-odbytniczą i może chcieć rozważyć spędzenie tygodnia na programowaniu w Haskell.