关于javascript中的闭包问题的一个例子

时间:2011-09-04 09:42:18

标签: javascript closures

总之,我对两者之间的区别感到困惑 handler.getName()function(){handler.getName()}

有关详细信息,请输入代码:

Jsfiddle checking url

我的问题是:
我使用 obj.method 时,可以参考处理程序
当我使用 obj.method2 时,这个引用 obj
我知道这是封闭的事情,但我只是不知道如何解释这些事情 希望有人能提供帮助,非常感谢!

3 个答案:

答案 0 :(得分:1)

在第一种情况下,您直接调用处理程序对象的方法getName,在第二种情况下,您实际上将函数的浅层副本放入obj对象中,因此当您调用时它将运行相同的代码但使用本地names属性,因此您获得"obj"。如果要删除names对象中的obj,则该值将是未定义的。它与闭包无关,您只需将函数的内容复制到新的对象方法中,该函数中的this将引用新的主对象。

答案 1 :(得分:0)

您的代码中的差异并非您认为的那样。在.method中,你这样做:

handler.getName()

在.method2中,您可以:

handler.getName

如果您将method2更改为:

handler.getName()

您将看到方法和方法2的结果相同。

答案 2 :(得分:0)

如果函数被调用为对象上的方法,那么 this 指的是 对象:

var x = {
    a: 1,
    f: function() {return this.a;}
};
document.write(x.f());   // writes 1

输入 obj.method()后,指的是 obj (尝试添加 handler.getName()之前的语句 document.write(this.names)。)  然后 getName()是 调用处理程序,以便 this 引用 handler.getName()中的处理程序

函数 handler.getName 仅分配给 obj.method2 ,尚未调用 this 尚未受约束。当调用 obj.method2()时,绑定到 method2()中的 obj

您也可以尝试全球范围:

var f = handler.getName;
f();  // now window.names = "the window" is written