Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于javascript中闭包的问题及示例_Javascript_Closures - Fatal编程技术网

关于javascript中闭包的问题及示例

关于javascript中闭包的问题及示例,javascript,closures,Javascript,Closures,那里 总之,我对两者的区别感到困惑 handler.getName()和 function(){handler.getName()} 有关更多详细信息,请参见代码: 我的问题是: 当我使用obj.method时,this可以引用处理程序和 当我使用obj.method2时,这个指的是obj 我知道这是关于结束的,但我不知道如何解释这些事情 希望有人能帮忙,谢谢 在第一种情况下,您直接调用handler对象的方法getName,在第二种情况下,您实际上将函数的一个浅层副本复制到obj对象中,

那里

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

有关更多详细信息,请参见代码:



我的问题是:
当我使用obj.method时,this可以引用处理程序和
当我使用obj.method2时,这个指的是obj
我知道这是关于结束的,但我不知道如何解释这些事情
希望有人能帮忙,谢谢

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

代码中的差异与您认为的不同。在.method中,可以执行以下操作:

handler.getName()
在.method2中,您需要:

handler.getName
如果将方法2更改为:

handler.getName()

您将看到method和method2的结果是相同的。

如果函数作为对象上的方法调用,则这是指 对象:

在输入obj.method()之后,这指的是obj(尝试添加 语句document.write(this.names)在handler.getName()之前。) 那么getName()是 在处理程序上调用,使其引用 handler.getName()中的处理程序

函数handler.getName仅分配给obj.method2,尚未调用,因此 他还没有受到约束。调用obj.method2()时,它将绑定到method2()内的obj

您还可以在全局范围内尝试:

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

这不仅与闭包有关,还与函数内部的
有关。
var f = handler.getName;
f();  // now window.names = "the window" is written