A diferença entre (1,eval)e simples evalé que o primeiro é um valor e o último é um lvalue. Seria mais óbvio se fosse algum outro identificador:
var x;
x = 1;
(1, x) = 1;
Essa é (1,eval)uma expressão que produz eval(como dizer, (true && eval)ou (0 ? 0 : eval)faria), mas não é uma referência a eval.
Por quê você se importa?
Bem, a Ecma especificação considera uma referência a evalser uma "chamada eval direta", mas uma expressão que apenas produz evala ser um indireto - e chamadas eval indiretos são garantidos para executar no âmbito global.
Coisas que ainda não sei:
- Em que circunstâncias uma chamada de avaliação direta não é executada no escopo global?
- Em que circunstância o resultado
thisde uma função no escopo global não pode produzir o objeto global?
Mais algumas informações podem ser obtidas aqui .
EDITAR
Aparentemente, a resposta à minha primeira pergunta é "quase sempre". Um direto é evalexecutado a partir do escopo atual . Considere o seguinte código:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Não surpreendentemente (heh-heh), isso imprime:
direct call: inner
indirect call: outer
EDITAR
Após mais experiências, direi provisoriamente que thisnão pode ser definido como nullou undefined. Ela pode ser configurada para valores Falsas (0, '', NaN, false), mas só muito deliberadamente.
Vou dizer que sua fonte está sofrendo de uma inversão cranio-retal leve e reversível e pode querer passar uma semana programando em Haskell.