我有一个对象,当该对象被实例化时,它将一个点击事件处理程序附加到 <body>
. (附加过程发生在该对象的定义中)
当 URL 改变时(当用户导航到另一个页面时)这个对象被实例化。
“每页”总是有一种类型的此对象,如前所述,它会在面板更改时重新实例化,旧对象将不再存在。
附加过程如下所示:
var doc = $(document.body);
doc.off('click');
doc.on('click', function(){
do_stuff();
});
我使用它是因为我注意到如果简单地附加事件处理程序,省略 .off()
,当我浏览网站时,处理程序将通过简单的单击触发更多次(因为它已附加/注册到该对象的每个实例化)。
现在,我可以将这个附加过程移动到其他地方,例如在发生实例化的代码部分,这样它就不会依赖于那个对象并确保处理程序只会被附加一次,但那会剥夺我的权利访问某些局部变量的权限,我必须让该代码部分可以访问它们。
我的问题是:这会不会在性能方面付出很多代价?我注意到这里的一些帖子,在 stackoverflow 上,强调这不是最佳的,但大多数示例显示的代码带有 .off()
。或解除绑定(bind)发生在 内部 .on()
/绑定(bind)。
重要说明:我正在使用 backbone.js。这是一个“单页网站”。这些对象基本上是 View ,它们的实例化发生在路由器中。
最佳答案
简而言之,不,使用 off
没有任何有意义的性能损失。现在我不会在一堆圣经上发誓 off
不可能导致性能问题,但我会说在 100 个中有 99 个(可能更像是 1,000 个中有 999 个或 10,000 个中有 9999 个) ) 真实世界的案例,您永远不必担心关闭会导致性能问题。
换句话说,off
永远不会导致明显的性能下降,除非你用它做了一些非常疯狂的事情,或者有一个非常疯狂的网站无意中做了一些非常疯狂的事情
另一方面,不调用 off
会导致很多问题,包括性能相关问题和其他问题。
关于javascript - .off()/.on() jQuery 事件处理程序绑定(bind)组合的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15545053/