La diferencia entre el viejo y simple y (1,eval)
eval
es que el primero es un valor y el segundo es un valor izquierdo. Sería más evidente si se tratara de algún otro identificador:
var x;
x = 1;
(1, x) = 1; // syntax error, of course!
Eso es (1,eval)
es una expresión que produce eval
(al igual que decir, (true && eval)
o (0 ? 0 : eval)
lo 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
para ser una indirecta - y llamadas eval indirectos están garantizados para ejecutar en el ámbito global .
cosas que todavía no sé:
- Bajo qué circunstancia no una llamada eval directa no ejecutar en el ámbito global?
- ¿En qué circunstancias puede el
this
de una función en el alcance global no producir el objeto global?
Se puede obtener algo más de información here.
EDITAR
Al parecer, la respuesta a la primera pregunta es, "casi siempre". Un eval
directo se 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)');
})();
No es sorprendente que
(je, je), esto imprime:
direct call: inner
indirect call: outer
EDITAR
Después de más experimentación, voy a decir que provisionalmente this
no se puede establecer en null
o undefined
. Se puede establecer en otros valores falsy (0, '', NaN, falso), pero solo muy deliberadamente.
Voy a decir que su fuente está sufriendo de una inversión craneo-rectal leve y reversible y que podría considerar pasar una semana de programación en Haskell.
He actualizado el título porque este es un caso específico. Además, * paréntesis * para el tipo específico de * corchetes *: [] y {} son completamente diferentes :) –