2016-01-27 3 views
0

посмотреть на этот кодАргументы объект не показывает правильный результат

enter code here 
function foo(a, b) { 
    arguments[1] = 2; 
    alert(b); 
} 

console.log(foo(1)); 

Его показ undefined я не могу понять, почему .. , потому что, когда мы проходим arguents

foo(1) `arguments[0]=1` right.? 

И когда мы alert(b) он должен отображать 2, потому что мы установили arguments[1] = 2; Я смущен .. пожалуйста, помогите. Благодарю.

+0

no Я не работаю в строгом режиме –

ответ

0

Ручное добавление элементов в arguments не установит сеттеров и добытчиками правильно. Даже обновление .length.

function foo(a, b){ 
    arguments[1] = 2; 
    console.log(arguments.length); //1 
} 

foo(1); 

Резюме: Не добавлять элементы в arguments. Помните, arguments не является массивом.

+0

Вы имеете в виду, что мы не можем модифицировать аргументы, переданные с помощью объекта Arguments? –

+0

@MarcAndreJiacarrini Да, вы можете, если они уже существуют в объекте 'arguments'. –

+0

Но здесь аргументы [1] dosen't выходят, потому что мы не прошли его правильно? –

0

Только оригинальные аргументы, которые существовали при вызове функции, были «сглажены» через объект arguments, так что вы могли бы изменить объект аргументов и также автоматически влиять на именованный аргумент функции.

FYI, в строгом режиме, ни один из объектов на объекте arguments не переименован в аргументы с именованной функцией. Но в нестрогом режиме аргументы, которые изначально существовали (и только те), сглажены обратно через объект arguments.

Имейте в виду, что объект arguments не является реальным массивом. Это особый тип объекта, и это специальное поведение «сглаживания» существует только для свойств этого объекта, которые были первоначально размещены там, когда вызывалась функция, а не для свойств, которые вы могли добавить сами. Поскольку arguments[1] изначально не существовал, у него нет этой специальной функции.

Смотреть это:

function foo(a, b) { 
    console.log(arguments.length); // 1 
    arguments[1] = 2; 
    console.log(arguments.length); // still 1 
    console.log(arguments[1]);  // does show 2 
    console.log(b);     // undefined, arguments[1] is not aliased to b 
} 

console.log(foo(1)); 
0

Имеет смысл, что b остается undefined. Когда вы запускаете foo(1), он инициализирует a до 1 и b до undefined. Изменение объекта arguments не изменит его. То есть b не является связан до arguments[1].