Dlaczego niewykonany eval ma wpływ na zachowanie w niektórych przeglądarkach?
Załóżmy, że mam te dwie funkcje:
function change(args) {
args[0] = "changed";
return " => ";
}
function f(x) {
return [x, change(f.arguments), x];
}
console.log(f("original"));
W większości przeglądarek, z wyjątkiem Opery, zwraca to["original", " => ", "original"]
.
Ale jeśli zmienięf
działają w ten sposób,
function f(x) {
return [x, change(f.arguments), x];
eval("");
}
wróci["original", " => ", "changed"]
w IE9, Safari 5 i Firefox 16 i 17.
Jeśli wymienięeval("")
zarguments
, zmieni się także w Chrome.
Możeszprzetestuj go na własnej przeglądarce na jsFiddle.
W ogóle nie rozumiem tego zachowania. Jeśli funkcja powróci przed wykonaniem tych instrukcji, w jaki sposób te instrukcje mogą wpływać na wartość zwracaną? Nawet jeśli instrukcje zostałyby wykonane, dlaczego miałyby mieć jakikolwiek wpływ na mutację argumentów?