add,remove 这两个闭包访问的 hide 函数为什么不是同一个函数呢,
正因为不是同一个函数,导致事件解绑失败了。
求高手指教
-------借助全局变量 addHide 保存调用 add 时访问的 hide ,代码如下-------
let addHide = null
function clickListener() {
function hide() {
console.log('hide exc')
}
function add() {
addHide = hide
document.addEventListener('click', hide, false)
}
function remove() {
console.log(hide === addHide);
document.removeEventListener('click', hide, false)
}
return {
add,
remove
}
}
clickListener().add()
clickListener().remove()
1
xxx749 2020-05-18 22:24:55 +08:00
你这代码跑了两次,所有 hide 函数也声明了两次,你把 clickListener 函数的返回值赋值给变量再试一次就相等了
|
4
rabbbit 2020-05-18 22:29:18 +08:00
const {add, remove} = clickListener()
add() remove() |
5
SoloCompany 2020-05-18 23:17:48 +08:00
这种问题很常见也是无解的
如果闭包不保证单例, 一般的解决方案是增加名称空间 add: $(document).on('click.moduleHash', hide) remove: $(document).off('click.moduleHash') |