基本上,您需要删除对这些函数的所有引用,以便 JavaScript 垃圾收集器可以收集它们。如果它们被绑定,您需要解除它们的绑定。如果那里有其他变量指向它们,则需要将它们设置为 null。
如果您发布一些代码可能会有所帮助;那么我们可以给出更好的答案。
...编辑:
这里发生的是,您正在创建一个比包含函数寿命更长的闭包:
function edit(){
$('.edit').click(function(){
//...
function _edit(boxTitle,selectedItemAmount){
//...
$('#box .yes').click(function(){
alert(boxTitle + ' for ' + selectedItemAmount + ' selected item');
$('#msg').hide(); // hide msg box when yes btn is clicked
});
}
//...
$('#box .no').click(function(){
$('#msg').hide();
});
});
换句话说,在一个函数内部,你说“将这个函数附加到一个 DOM 对象”,而你是在内联的。JavaScript 从外部上下文中捕获变量,并在对内部上下文的引用处于活动状态时使它们保持活动状态。
您需要做的是在非内联的地方定义函数,然后使用它们:
function boxClickYes(e) {
alert(e.data.boxTitle + ' for ' + e.data.selectedItemAmount +
' selected item');
$('#msg').hide(); // hide msg box when yes btn is clicked
}
function boxClickNo(e) {
$('#msg').hide();
}
function edit(){
$('.edit').click(function(){
//...
function _edit(boxTitle,selectedItemAmount){
//...
$('#box .yes').bind("click", {boxTitle: boxTitle,
selectedItemAmount: selectedItemAmount}, boxClickYes);
}
//...
$('#box .no').click(boxClickNo);
});
这还演示了如何使用 jQuery click 处理程序中的 data 属性在附加处理程序和使用它的时间之间存储数据(而不是将数据存储在将作用域链保留在内存中的闭包中)。当您只是在那里使用它时(例如 a 的主体$.each
),使用内联定义的函数很好,但是当您附加事件处理程序时就不行了。