La diferencia entre (1,eval)y simple y viejo evales 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 evalser una "llamada directa eval", sino una expresión que se limita a rinde evala 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
thisde 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 evalejecuta 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 thisno se puede establecer en nullo 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.