Der Unterschied zwischen (1,eval)
und einfach alt eval
ist, dass Ersteres ein Wert ist und letzteres ist. Es wäre offensichtlicher, wenn es eine andere Kennung wäre:
var x;
x = 1;
(1, x) = 1; // syntax error, of course!
Das ist (1,eval)
ein Ausdruck, der nachgibt eval
(genau wie sagen,(true && eval)
oder (0 ? 0 : eval)
würde), aber es ist kein Hinweis auf eval
.
Warum kümmert es dich?
Nun, die Ecma-Spezifikation berücksichtigt einen Verweis aufeval
einen „direkten eval Anruf“ zu sein, sondern einen Ausdruck, der lediglich ergibt eval
eine indirekter zu sein - und indirekte eval Anrufe werden in globalem Bereich auszuführen garantiert.
Dinge, die ich immer noch nicht weiß:
- Unter welchen Umständen ruft eine direkte Bewertung auf nicht im globalen Bereich ausgeführt?
- Unter welchen Umständen kann die
this
Funktion einer Funktion im globalen Bereich das globale Objekt nicht ergeben?
Weitere Informationen finden Sie hier .
BEARBEITEN
Anscheinend lautet die Antwort auf meine erste Frage "fast immer". Ein direkter eval
wird aus dem aktuellen Bereich ausgeführt. Betrachten Sie den folgenden Code:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Es überrascht nicht (heh-heh), dies druckt aus:
direct call: inner
indirect call: outer
BEARBEITEN
Nach weiteren Experimenten werde ich vorläufig sagen, dass this
dies nicht auf null
oder eingestellt werden kann undefined
. Es kann auf andere falsche Werte (0, '', NaN, false) gesetzt werden, aber nur sehr absichtlich.
Ich werde sagen, dass Ihre Quelle unter einer milden und reversiblen kranio-rektalen Inversion leidet und möglicherweise eine Woche lang in Haskell programmieren möchte.