¿Por qué una evaluación no ejecutada tiene un efecto en el comportamiento en algunos navegadores?
Supongamos que tengo estas dos funciones:
function change(args) {
args[0] = "changed";
return " => ";
}
function f(x) {
return [x, change(f.arguments), x];
}
console.log(f("original"));
En la mayoría de los navegadores, excepto Opera, esto devuelve["original", " => ", "original"]
.
Pero si cambio elf
funciona de esta manera,
function f(x) {
return [x, change(f.arguments), x];
eval("");
}
volverá["original", " => ", "changed"]
en IE9, Safari 5, y Firefox 16 y 17.
Si sustituyoeval("")
conarguments
, también cambiará en Chrome.
Usted puedepruébalo en tu propio navegador en jsFiddle.
No entiendo este comportamiento en absoluto. Si la función vuelve antes de que se ejecuten esas declaraciones, ¿cómo pueden esas declaraciones afectar el valor de retorno? Incluso si las declaraciones se ejecutaran, ¿por qué tendrían algún efecto en la mutación del argumento?