Как это поведение можно объяснить? Почему он печатает {а: 10}?

var a = {};

(function b ( a ) {
    a.a = 10;
    a = null;
})( a );

console.log(a); // { a: 10 }
0
mcmxc 29 Авг 2017 в 13:02

3 ответа

Лучший ответ

В JS объекты передаются по ссылке. Поэтому, когда вы делаете ()(a), вы передаете ссылку на a в качестве аргумента.

Теперь эта ссылка сохраняется в локальной переменной в качестве аргументов. Поэтому, когда вы обновляете переменную, вы по существу переопределяете объект в этом месте.

Хитрость в том, когда вы заменяете ссылку. a=null обновит ссылку в аргументной переменной a, но не переопределит объект в ссылке. Таким образом, оригинальный объект все еще доступен, но на него нет ссылок.

После IIFE, когда вы снова регистрируетесь, так как область действия переменной аргумента закончена, она уничтожается, и a снова указывает на исходный a.

Следовательно, вы получаете {a: 10}

1
Rajesh 29 Авг 2017 в 10:11

Внутри функции a ссылается на локальную переменную, переданную в функцию. Поскольку вы выбрали то же имя, это сбивает с толку, но посмотрите на это:

var a = {};

(function b ( c ) {
    console.log('1. c = ', c);
    console.log('2. a = ', a);
    c.a = 10;
    console.log('3. c = ', c);
    console.log('4. a = ', a);
    a = null;
})( a );

console.log('5. a = ', a);

Возвращает ноль, как и ожидалось

1
thedude 29 Авг 2017 в 10:17

a внутри вашей функции - это переменная, отличная от глобальной a. Вы передаете значение глобальной переменной a в свою функцию, которая создает локальную переменную. Тот факт, что вы назвали эту локальную переменную a, просто означает, что она скрывает глобальную переменную с тем же именем.

Так что это две разные переменные, но их значения являются ссылками на созданный вами объект. Внутри вашей функции вы пишете свойство этого объекта. Затем вы назначаете null локальной переменной a. Это только удаляет эту конкретную ссылку на объект, но объект все еще существует, и глобальная переменная все еще ссылается на него, поэтому, когда вы console.log() эту глобальную переменную, он будет печатать объект.

1
Lennholm 29 Авг 2017 в 10:30