2015-12-01 2 views
2

Я немного запутался с тем, как закрытие работ по этому коду:Закрытие на объекте

function Spy(target, method) { 
    var result = {count: 0}, 
     oldFn = target[method]; 
    target[method] = function(input) { 
     result.count++; 
     return oldFn.apply(target, arguments); 
    } 
    return result; 
} 

Итак, когда вы задаете этот переменной как

var logSpy = Spy(console, 'log') 

logSpy объект с свойство count. Если вы должны были вызвать console.log, перезаписанная функция увеличивала бы значение result.count, но результат, к которому он обращается, вложен, правильно? Итак, как создается связь между вложенным объектом и глобальным объектом logSpy? Я предполагаю, что объект logSpy ссылается на закрытый объект, потому что объекты передаются переменным по ссылке? Так что logSpy как объект технически не существует в глобальном контексте выполнения, а является просто ссылкой на закрытие?

+0

Я думаю, что это правильно - определение функции внутри замыкания дает этой функции доступ ко всем переменным в этом закрытии. Я могу только говорить по опыту, однако, я не знаю внутренней работы JS. –

+0

«В JavaScript сам объект функции содержит недопустимое свойство, указывающее на объект, содержащий переменные из его области объявления». [Ссылка] (https://lostechies.com/derekgreer/2012/02/17/javascript-closures-explained/) – xersiee

ответ

1

Когда вы звоните Spy(console, 'log'), у него есть 4 вещи.

  1. Создает объект result.
  2. oldFn (ссылка) console.log (или, скорее, console['log']).
  3. Устанавливает console['log'] в новую функцию, которая «закрывается» вокруг result и oldFn.
  4. Возврат (ссылка) result.

Итак, что происходит, что console.log теперь новой функция, но result и oldFn все еще существуют в памяти - они не были мусора еще - потому что есть ссылки на них в этой новой функции.

При вызове console.log он обновляет count свойство result объекта (который у вас есть ссылки на, как logSpy), а затем называет «резервной копии» oldFn функцию с нужными контекстных/параметрами.

Смежные вопросы