我对这个代码的闭包效果有点困惑:
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 :(得分:1)
当你致电Spy(console, 'log')
时,它会做4件事。
result
对象。oldFn
设置为(引用)console.log
(或更确切地说console['log']
)。console['log']
设置为在result
和oldFn
周围“关闭”的新功能。result
。所以,正在发生的事情是console.log
现在是新的函数,但result
和oldFn
仍然存在于内存中 - 它们并未被垃圾收集然而 - 因为在新功能中有对它们的引用。
当您致电console.log
时,它会更新count
对象的result
属性(您引用为logSpy
),然后调用“备份” “oldFn
具有正确的上下文/参数。