一段时间以来,我一直不确定围绕闭包的 JS 垃圾收集规则,所以我想我不妨问一下……这是一个很好的例子,我对涉及 jQuery 的$.each
方法感到好奇:
storeSelection: function() {
var enabledIds = {};
$.each(this.nodes, function(index, node) {
if (node.enabled) {
enabledIds[ node.id ] = true;
}
});
this.selection = enabledIds;
}
当然,上面的代码片段是对象字面量的一部分。因此,我在外部函数的顶部创建了一个新对象,它将在数组中存储启用项的 ID。使用 jQuery 的.each()
方法,我循环遍历项目数组并记录启用的 ID。最后,我将选择存储为父对象的成员。
enabledIds
我的问题涉及从外部范围引用对象的内部函数。既然enabledIds
会一直留着,那会不会妨碍内部功能被收集呢?我假设不会,因为它只是一个在内部函数末尾被清除的变量,对吧?要成为泄漏,我假设内部函数需要对外部对象进行硬引用,如下所示:
$.each(this.nodes, function(index, node) {
this.badIdea = enabledIds;
if (node.enabled) {
enabledIds[ node.id ] = true;
}
});
但是......我总是对这条规则感到困惑。任何帮助消除这种混乱将不胜感激!