WebSocket连接关闭或置空后,message监听器会自动移除吗?
WebSocket监听器在连接关闭并置为null后是否自动移除?
结论:不会自动移除,但会失去触发条件,最终随对象被垃圾回收
当你执行socket.close(3001, "Reason: PopUp Closed")关闭WebSocket连接后,只是将连接状态切换为CLOSED,WebSocket对象本身并未立即销毁,之前通过addEventListener绑定的message监听器依然附着在该对象上。不过因为连接已经关闭,服务器无法再发送消息,所以这些监听器不会再被触发。
当你将socket = null后,如果没有其他代码持有该WebSocket对象的引用,JavaScript的垃圾回收机制会在后续的回收周期中清理这个对象,绑定在它上面的监听器也会随之被移除。
如果你需要主动、立即移除监听器(比如避免潜在的内存泄漏风险,或者后续可能复用socket对象的场景),需要提前保留监听器函数的引用,再调用removeEventListener来移除:
// 保存监听器函数引用 const messageListener = (event) => { console.log("Message from server ", event.data); }; // 添加监听器 socket.addEventListener("message", messageListener); // 关闭连接并主动移除监听器 socket.close(3001, "Reason: PopUp Closed"); socket.removeEventListener("message", messageListener); socket = null;
内容的提问来源于stack exchange,提问作者aryankarim
相关产品推荐
相关产品推荐

