jQuery .off()方法中的函数处理程序

Function handler in jQuery .off() method

本文关键字:函数 处理 程序 方法 off jQuery      更新时间:2023-09-26

谁能解释一下,为什么脚本会这样:当我在#wrapper click handler中声明函数fn时,.off()方法不会从#cover中删除处理程序。

$('#wrapper').on('click', 'button', function (){
function fn(){
  alert('on')
}
    if($(this).is('#add')){
        $('#info').text('event added')
        $('#cover').on('click', fn)
    }
    if($(this).is('#remove')){
        $('#info').text('event removed');
        $('#cover').off('click', fn);
    }
})

但是当它在(全局作用域)之外时,它工作得很好。

function fn(){
  alert('on')
}
$('#wrapper').on('click', 'button', function (){
    if($(this).is('#add')){
        $('#info').text('event added')
        $('#cover').on('click', fn)
    }
    if($(this).is('#remove')){
        $('#info').text('event removed');
        $('#cover').off('click', fn);
    }
})

这是一个范围问题。如果在$('#wrapper')中定义。on('click'), fn变量将包含对函数的引用,并且每次

因此,off将尝试通过删除与on

初始设置不同的引用来删除事件。

如果在全局作用域中定义fn,它将在整个执行过程中保持相同的引用

前者的问题是,当你再次点击按钮时,你会重新定义fn,也就是说,你的onoff函数接收到的参数fn完全不同。