使用原型函数作为事件处理器是否会引发内存泄漏?
关于WebSocket与原型函数引用的内存泄漏问题
好问题!咱们来把这个问题拆解开,搞清楚到底会不会造成内存泄漏:
首先要明确一个核心点:函数本身不会自动持有调用它的对象的引用。你把foo.prototype.bar赋值给socket.onopen,本质是让socket对象持有了这个原型函数的引用,但反过来,这个原型函数并没有捕获或持有socket的引用——除非函数内部用闭包绑定了socket,但你的代码里并没有这么做。
那具体到你的场景:
foo.prototype.bar是挂载在原型上的函数,确实会长期存在,但它本身和socket对象没有任何绑定关系,只是socket的onopen属性指向了它而已。- 当
test()执行完毕后,局部变量socket会离开作用域。此时判断socket能否被垃圾回收,关键看有没有其他可达的引用指向它:- 如果WebSocket连接已经关闭(或者根本没连上),且没有其他事件处理器(比如
onclose、onerror)持有对socket的引用,同时引擎判断这个socket对象已经没有任何实际用途了,那它就会被标记为可回收。 - 哪怕
socket.onopen还指向那个原型函数,也没关系——因为是socket引用函数,不是函数引用socket,函数的存在不会阻碍socket的回收。
- 如果WebSocket连接已经关闭(或者根本没连上),且没有其他事件处理器(比如
简单说:只要socket对象本身没有被其他外部变量或闭包引用,哪怕它的事件处理器指向一个长期存在的原型函数,也不会阻止垃圾回收,自然不会造成内存泄漏。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

