La différence entre (1,eval)
et la plaine de vieux - eval
, c'est que le premier est une valeur et le dernier est une lvalue. Il serait plus évident si elle était une autre identificateur:
var x;
x = 1;
(1, x) = 1; // syntax error, of course!
C'est - (1,eval)
est une expression que les rendements en eval
(un peu comme dire, (true && eval)
ou (0 ? 0 : eval)
serait), mais ce n'est pas une référence à l' eval
.
Pourquoi s'en faire?
Eh bien, l'Ecma spec considère comme une référence à l' eval
être un "direct eval appel", mais une expression qui ne fait que les rendements en eval
pour être l'une indirecte -- et indirects eval appels sont garantis à exécuter dans la portée globale.
Des choses que je ne sais toujours pas:
- Dans quelles circonstances un direct eval appel de ne pas exécuter dans la portée globale?
- Dans quelles circonstances peut l'
this
d'une fonction à une portée mondiale, pas de rendement global de l'objet?
Plus d'informations peuvent être glanées ici.
MODIFIER
Apparemment, la réponse à ma première question est, "presque toujours". Un direct, eval
s'exécute à partir de l' actuel champ d'application. Considérons le code suivant:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Il n'est pas surprenant (heh-heh), cette affiche:
direct call: inner
indirect call: outer
MODIFIER
Après plus d'expérimentation, je vais provisoirement dire qu' this
ne peut pas être null
ou undefined
. Il peut être réglé à d'autres falsy valeurs (0, ", NaN, false), mais seulement très délibérément.
Je vais dire que votre source est atteint d'une légère et réversible cranio-rectale et inversion pourriez envisager de passer une semaine à la programmation Haskell.