ben*_*ben 5 javascript jquery memory-leaks selectable
有谁知道如何破坏javascript(jquery)函数?我正在使用jquery"selectable",并且在可选择的"stop"事件上触发了函数调用"edit".
在这个"编辑"功能中,我有很多"点击"事件嵌套开关功能,每个"点击"事件中都有很多功能.我的问题是,每当我触发"可选"功能时,"edit"功能内的事件再次被触发,但之前的功能和事件仍然存在.我现在做的是取消绑定功能"编辑"中的每个事件在可选择的"开始"甚至.
这是内存泄漏问题吗?有没有办法在javascript中"破坏"功能?我试图在函数结束时将函数声明为null但这不起作用.其中的功能和事件仍然存在.
谁有线索?
演示页面 - > http://dreamerscorp.com/test/test01/javascript_destory_test.html
编辑2009/10/31 :)非常感谢您的帮助,您的评论对我非常有用,再次感谢!!!
您可以尝试使函数无效,或者覆盖它,分配一个不执行任何操作的匿名函数:
myFunction = null;
// or
myFunction = function () {};
Run Code Online (Sandbox Code Playgroud)
您也可以在函数内部执行此操作:
var autoDestroy = function () {
autoDestroy = null;
//...
return 1;
};
autoDestroy(); // returns 1
autoDestroy(); // TypeError: autoDestroy is not a function
Run Code Online (Sandbox Code Playgroud)
在jquery中取消绑定事件使用unbind函数http://docs.jquery.com/Events/unbind
$("something").click(function() {
$("anotherOne").click(function() {
....
});
});
Run Code Online (Sandbox Code Playgroud)
在这个例子中,每次点击"something"时,都会向"anotherOne"添加一个事件处理程序,所以如果你点击三次,你将得到三个事件处理程序.
$("something").click(function() {
$("anotherOne").unbind('click').click(function() {
....
});
});
Run Code Online (Sandbox Code Playgroud)
在这里,你可以保证在"anotherOne"上只有一个点击处理程序.
没有必要明确地销毁先前的处理程序.
基本上,您需要删除对这些函数的所有引用,以便 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();
});
});
Run Code Online (Sandbox Code Playgroud)
换句话说,在一个函数中,你是在说,“把这个函数附加到一个 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);
});
Run Code Online (Sandbox Code Playgroud)
这也演示了如何使用 jQuery 单击处理程序中的 data 属性在附加处理程序和使用它的时间之间存储数据(而不是将该数据存储在将作用域链保留在内存中的闭包中)。当您只是在那里使用它时(例如 a 的主体),使用内联定义的函数很好$.each,但是当您附加事件处理程序时就不行了。
| 归档时间: |
|
| 查看次数: |
33558 次 |
| 最近记录: |