La différence entre (1,eval)
et plain old eval
est que le premier est une valeur et le second est une lvalue. Ce serait plus évident s'il s'agissait d'un autre identifiant:
var x;
x = 1;
(1, x) = 1;
C'est (1,eval)
une expression qui cède eval
(comme dire, (true && eval)
ou (0 ? 0 : eval)
voudrait), mais ce n'est pas une référence à eval
.
Qu'est-ce que tu en as à faire?
Eh bien, la spécification Ecma considère une référence à eval
être un « appel eval directe », mais une expression qui donne simplement eval
être un effet indirect - et les appels eval indirects sont garantis pour exécuter une portée mondiale.
Des choses que je ne sais toujours pas:
- Dans quelles circonstances un appel d'évaluation directe ne s'exécute-t-il pas dans une portée globale?
- Dans quelles circonstances le
this
d'une fonction à portée globale ne peut-il pas produire l'objet global?
Quelques informations supplémentaires peuvent être glanées ici .
ÉDITER
Apparemment, la réponse à ma première question est «presque toujours». Un direct eval
s'exécute à partir de la portée actuelle . Considérez le code suivant:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Sans surprise (heh-heh), ceci imprime:
direct call: inner
indirect call: outer
ÉDITER
Après plus d'expérimentation, je vais provisoirement dire que this
cela ne peut pas être réglé sur null
ou undefined
. Il peut être défini sur d'autres valeurs fausses (0, ``, NaN, false), mais seulement très délibérément.
Je vais dire que votre source souffre d'une inversion cranio-rectale légère et réversible et que vous voudrez peut-être envisager de passer une semaine à programmer à Haskell.