有没有人知道如何销毁javascript(jquery)函数? 我正在使用jquery“selectable”,并且在可选择的“stop”事件中触发了一个函数调用“edit”。
在这个“编辑”功能中,我已经嵌套了许多“点击”事件的开关功能 我在每个“点击”事件中都有很多功能。我的问题是, 每当我触发“可选”功能时,“edit”功能内的事件再次被触发,但之前的功能和事件仍然存在。 我现在做的是取消绑定功能“编辑”中的每个事件在可选择的“开始”甚至。
这是内存泄漏问题吗? 有没有办法在javascript中“破坏”功能? 我试图在函数结束时将函数声明为null但这不起作用。其中的功能和事件仍然存在。
任何人都有线索?
此处的演示页面 - > http://dreamerscorp.com/test/test01/javascript_destory_test.html
编辑2009/10/31 :)非常感谢你的帮助,你的评论对我非常有用,再次感谢!!!
答案 0 :(得分:8)
您可以尝试使该函数无效,或者覆盖它,指定一个不执行任何操作的匿名函数:
myFunction = null;
// or
myFunction = function () {};
您也可以在功能本身内完成:
var autoDestroy = function () {
autoDestroy = null;
//...
return 1;
};
autoDestroy(); // returns 1
autoDestroy(); // TypeError: autoDestroy is not a function
答案 1 :(得分:6)
取消绑定jquery中的事件使用unbind函数http://docs.jquery.com/Events/unbind
$("something").click(function() {
$("anotherOne").click(function() {
....
});
});
在这个例子中,每次点击“something”时,都会在“anotherOne”中添加一个事件处理程序,所以如果点击三次,你将获得三个事件处理程序。
$("something").click(function() {
$("anotherOne").unbind('click').click(function() {
....
});
});
这里保证“anotherOne”上只有一个点击处理程序。
没有必要明确地销毁先前的处理程序。
答案 2 :(得分:4)
基本上,您需要删除对这些函数的所有引用,以便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单击处理程序中使用data属性在附加处理程序的时间和使用它的时间之间存储数据(而不是将数据存储在将范围链保留在内存中的闭包中)。当你刚刚在那里使用内联定义函数时(例如$.each
的主体),使用内联定义的函数就好了。但是当你附加事件处理程序时它不行。
答案 3 :(得分:1)
要在javascript中“销毁”某个功能,只需确保该功能无法访问即可。这将使该功能有资格进行回收。 需要注意的一点是javascript变量是基于作用域(而不是作为单个变量)绑定的,并且如果绑定保留在作用域中,则许多未使用的对象可能会持久存在: 提供更多帮助需要了解特定代码及其使用方法。
请将javascript delete运算符视为删除变量或对象成员的一种方法。将值设置为null / undefined / other-object会在到达先前引用的对象的方法上删除(尽管它可能仍然可以访问,因此不会被回收)但不会删除变量/ member。
delete variable
delete obj.member
delete obj[member]