Как это поведение можно объяснить? Почему он печатает {а: 10}?
var a = {};
(function b ( a ) {
a.a = 10;
a = null;
})( a );
console.log(a); // { a: 10 }
3 ответа
В JS объекты передаются по ссылке. Поэтому, когда вы делаете ()(a)
, вы передаете ссылку на a
в качестве аргумента.
Теперь эта ссылка сохраняется в локальной переменной в качестве аргументов. Поэтому, когда вы обновляете переменную, вы по существу переопределяете объект в этом месте.
Хитрость в том, когда вы заменяете ссылку. a=null
обновит ссылку в аргументной переменной a
, но не переопределит объект в ссылке. Таким образом, оригинальный объект все еще доступен, но на него нет ссылок.
После IIFE, когда вы снова регистрируетесь, так как область действия переменной аргумента закончена, она уничтожается, и a
снова указывает на исходный a
.
Следовательно, вы получаете {a: 10}
Внутри функции 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);
Возвращает ноль, как и ожидалось
a
внутри вашей функции - это переменная, отличная от глобальной a
. Вы передаете значение глобальной переменной a
в свою функцию, которая создает локальную переменную. Тот факт, что вы назвали эту локальную переменную a
, просто означает, что она скрывает глобальную переменную с тем же именем.
Так что это две разные переменные, но их значения являются ссылками на созданный вами объект. Внутри вашей функции вы пишете свойство этого объекта. Затем вы назначаете null
локальной переменной a
. Это только удаляет эту конкретную ссылку на объект, но объект все еще существует, и глобальная переменная все еще ссылается на него, поэтому, когда вы console.log()
эту глобальную переменную, он будет печатать объект.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.