Почему неисполненный eval влияет на поведение в некоторых браузерах?

Предположим, у меня есть эти две функции:

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.

Я вообще не понимаю этого поведения. Если функция возвращается до выполнения этих операторов, как эти операторы могут повлиять на возвращаемое значение? Даже если операторы были выполнены, почему они влияют на мутацию аргумента?

Ответы на вопрос(3)

Ваш ответ на вопрос