La diferencia entre (1,eval)
y simple y viejo eval
es que el primero es un valor y el segundo es un valor. Sería más obvio si fuera algún otro identificador:
var x;
x = 1;
(1, x) = 1;
Esa es (1,eval)
una expresión que cede eval
(como diría (true && eval)
o (0 ? 0 : eval)
haría), pero no es una referencia a eval
.
¿Por qué te importa?
Bueno, la especificación ECMA considera una referencia a eval
ser una "llamada directa eval", sino una expresión que se limita a rinde eval
a ser uno indirecto - y llamadas eval indirectos están garantizados para ejecutar en el ámbito global.
Cosas que todavía no sé:
- ¿En qué circunstancias no se ejecuta una llamada de evaluación directa en el ámbito global?
- ¿Bajo qué circunstancia puede el
this
de una función en el alcance global no producir el objeto global?
Puede obtener más información aquí .
EDITAR
Aparentemente, la respuesta a mi primera pregunta es "casi siempre". Un directo se eval
ejecuta desde el alcance actual . Considere el siguiente código:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Como era de esperar (jejeje), esto imprime:
direct call: inner
indirect call: outer
EDITAR
Después de más experimentación, voy a decir provisionalmente que this
no se puede establecer en null
o undefined
. Se puede establecer en otros valores falsos (0, '', NaN, falso), pero solo de forma muy deliberada.
Voy a decir que su fuente está sufriendo de una inversión cráneo-rectal leve y reversible y quizás quiera considerar pasar una semana programando en Haskell.