Różnica między (1,eval)
a zwykłym starym eval
polega 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ę eval
być „bezpośrednie połączenie eval”, ale to tylko wyraz daje w wyniku eval
być 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
this
funkcja 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 eval
wykonywany 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 this
nie można ustawić na null
lub 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.