Der Unterschied zwischen (1,eval)und einfach alt evalist, 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 evaleine 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
thisFunktion 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 evalwird 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 thisdies nicht auf nulloder 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.