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 eval
ser uma "chamada eval direta", mas uma expressão que apenas produz eval
a 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
this
de 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 é eval
executado 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 this
não pode ser definido como null
ou 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.