Por que uma avaliação não executada afeta o comportamento de alguns navegadores?
Vamos supor que eu tenha essas duas funções:
function change(args) {
args[0] = "changed";
return " => ";
}
function f(x) {
return [x, change(f.arguments), x];
}
console.log(f("original"));
Na maioria dos navegadores, exceto o Opera, isso retorna["original", " => ", "original"]
.
Mas se eu mudar of
funcionam assim,
function f(x) {
return [x, change(f.arguments), x];
eval("");
}
ele retornará["original", " => ", "changed"]
no IE9, Safari 5 e Firefox 16 e 17.
Se eu substituireval("")
comarguments
, também mudará no Chrome.
Você podeteste-o no seu próprio navegador no jsFiddle.
Eu não entendo esse comportamento em tudo. Se a função retornar antes que essas instruções sejam executadas, como essas instruções podem afetar o valor de retorno? Mesmo se as declarações fossem executadas, por que elas teriam algum efeito na mutação do argumento?