SvDenys
@SvDenys
Интересуюсь веб-разработкой

Странное поведение замыканий JS. Где ошибка?

В процессе изучения замыканий JS наткнулся на такой любопытный пример:
function test(ob){
    return function(x){
        return (ob.a + ob.b) * x
    }
}

var obj = {
    a : 1,
    b : 2
}

var x = test(obj);
console.log(x(10)); // (1+2) * 10 = 30

obj.a = 3;
console.log(x(10)); // (3+2) * 10 = 50

obj = null;
console.log(x(10)); // вернет 50, но откуда???


Помогите понять, пожалуйста, откуда в последнем вызове x(10) берется obj != null?
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
obj - это ссылка на объект. Вы передали эту ссылку в функцию test (при этом возникла ее копия ob) и на ob замкнули анонимную функцию. Когда вы обнулили ссылку obj = null - с самим объектом ничего не стало и ob продолжает на него ссылаться.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
Чтобы лучше понять что происходит, следует уяснить, что

  • Сам объект не принадлежит ни одной переменной, в них хранится лишь ссылка на него. А сам он прячется где-то в памяти браузера.

-
var ob = obj; //Скопировали ссылку

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

var obj = {1:0, 2:10}, ob = obj;

obj = 228;
//obj больше не ссылается на объект, теперь это просто число.
//А вот ob так и продолжает это делать
console.log(ob);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы