Предположим, что у меня есть две функции:
function change(args) {
args[0] = "changed";
return " => ";
}
function f(x) {
return [x, change(f.arguments), x];
}
console.log(f("original"));
В большинстве браузеров, кроме Opera, это возвращает ["original", " => ", "original"]
.
Но если я изменю функцию f
, подобную этой,
function f(x) {
return [x, change(f.arguments), x];
eval("");
}
он вернет ["original", " => ", "changed"]
в IE9, Safari 5 и Firefox 16 и 17.
Если я заменил eval("")
на arguments
, он также изменится в Chrome.
Вы можете проверить его в своем браузере на jsFiddle.
Я вообще не понимаю этого поведения. Если функция возвращается до выполнения этих операторов, как эти утверждения могут влиять на возвращаемое значение? Даже если инструкции выполнялись, почему они могут повлиять на мутацию аргумента?