关闭一个对象

时间:2015-12-01 20:18:35

标签: javascript closures

我对这个代码的闭包效果有点困惑:

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作为一个对象在技术上不存在于全局执行上下文中,而只是对闭包的引用吗?

1 个答案:

答案 0 :(得分:1)

当你致电Spy(console, 'log')时,它会做4件事。

  1. 创建result对象。
  2. oldFn设置为(引用)console.log(或更确切地说console['log'])。
  3. console['log']设置为在resultoldFn周围“关闭”的新功能。
  4. 返回(引用)result
  5. 所以,正在发生的事情是console.log现在是新的函数,但resultoldFn仍然存在于内存中 - 它们并未被垃圾收集然而 - 因为在新功能中有对它们的引用。

    当您致电console.log时,它会更新count对象的result属性(您引用为logSpy),然后调用“备份” “oldFn具有正确的上下文/参数。