La différence entre (1,eval)et plain old evalest 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
thisd'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 evals'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 thiscela ne peut pas être réglé sur nullou 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.