垃圾收集 - Javascript - 释放一个记忆函数

garbage collection - Javascript - free a memorized function

本文关键字:一个 函数 记忆 释放 Javascript      更新时间:2023-09-26

我必须说我不知道正确的术语,所以请原谅我的一些错误。我有一个带有行的表格。表中最后一行的最后一列是使用 Tab 键启用的,该键会自动创建新行。

function enableTab() {
  lastEditable = currentTable
    .find("tr")
    .find('textarea, .cleanbox-editable-cell')
    .not(function(index, element) {
        return $(element).parent().css("display") == "none";
    })
    .last();
  lastEditable.unbind("keydown");
  lastEditable.keydown(function(e) {
    var keyCode = e.keyCode || e.which;
    createNewRow();
  };
};
function createNewRow() {
  createRow();
  enableTab();
}

创建新行时,将重新计算 lastEditable 变量。我想要的是 lastEditable 仅与最后一行的最后一列相关联。无论如何,发生的情况是创建一个新行,并且新行和前一行的最后一列都配备了创建新行的功能,而我希望只有行能够执行这样的功能。

所以,在我看来,发生的情况是:每次创建新行时,变量 lastEditable 都会正确地与新行的最后一列相关联。但是之前与同一变量关联的对象的函数不会被删除:它只是不再有名称。

我说的对吗?如何删除对象?

我尝试了以下方法,但没有用:

lastEditable.keydown(function(e) {
    var keyCode = e.keyCode || e.which;
    delete lastEditable;
    createNewRow();
};

您正在取消绑定事件处理程序,然后立即将同一事件处理程序重新应用于同一元素。您需要重新组织代码,以便在创建新行时将事件处理程序绑定到新元素 http://jsfiddle.net/2fLrsjcz/

var currentTable = $('table');
function bindKeyDown(lastEditable) {
    lastEditable.keydown(function(e) {
        if(e.keyCode == 9) {
            createNewRow($(this));
        }
    });
}
function getLastEditable() {
    return currentTable
    .find("tr")
    .find('textarea, .cleanbox-editable-cell')
    .not(function(index, element) {
        return $(element).parent().css("display") == "none";
    })
    .last();
}
function createNewRow($lastEditable) {
    var newEditable = $lastEditable.parent().parent().clone().appendTo(currentTable);
    $lastEditable.unbind("keydown");
    bindKeyDown(getLastEditable());
}
bindKeyDown(getLastEditable());

为了改进这篇文章可能对其他人有用,研究 Lee 的代码,我已经解决了我的问题,只需将 lastEditable.unbind("keydown") 移动到 .keydown(function(e) {}) 中,如下所示:

function enableTab() {
  lastEditable = currentTable
    .find("tr")
    .find('textarea, .cleanbox-editable-cell')
    .not(function(index, element) {
        return $(element).parent().css("display") == "none";
    })
    .last();
  lastEditable.keydown(function(e) {
    var keyCode = e.keyCode || e.which;
    lastEditable.unbind("keydown");
    createNewRow();
  };
};
function createNewRow() {
  createRow();
  enableTab();
}