JavaScript中的闭包可以被视为像子对象一样吗?

时间:2017-12-15 18:33:46

标签: javascript closures

我目前正在研究什么是闭包以及它们是如何工作的,而且我认为看到闭包的最佳方式基本上是作为子对象,即父对象的一部分或子。

闭包是一个存在于另一个函数中的函数,这意味着父函数可以返回这个子函数,就像父函数中的其他函数一样。

返回一个函数的问题是它是在其父对象的范围内创建的,因此它可能需要访问其范围内的某些资源。

当某个函数(即一个对象)通过引用传递某些内容时,在代码中没有任何引用之前,它就无法删除。

当垃圾收集发生时,它会查看内存中剩余的内容,任何不需要的东西都会被标记并有效删除,从而释放内存空间。闭包所需的任何东西,比如代码,内部变量,父变量,参数等(函数所说的范围内的东西)都留在那里。当不再需要这些东西时,稍后它将被垃圾收集器标记并删除。

所以基本上闭包是子对象,它包含返回的函数以及从其作用域开始工作所需的东西,而父对象的其余部分将被删除,因为没有引用/需要它。最后,稍后,当代码不再需要子对象/闭包时,它实际上被标记为未被引用,并从内存中删除。

这听起来粗略/概念上对吗?

1 个答案:

答案 0 :(得分:0)

是的,这是大致正确的,只有一点点变化。不要把它看作是一个子对象。将其视为一个对象,但可以捕获它所需要的对象。正如你所说,如果一个闭包是在一个函数的范围内定义的,并且它使用该函数的本地成员,那么闭包'捕获'这些值,基本上就像添加其他所有者一样。这是在处理计数器时让很多人绊倒的事情,并没有意识到他们正在携带来自其他功能的'转义'本地变量实例。

但总的来说,你的一般理解是非常正确的。