我得到了这个文件说这里有一个关闭:
function addHandler(){
document.getElementById('el').onclick = function(){
this.style.backgroundColor = 'red';
};
}
Run Code Online (Sandbox Code Playgroud)
虽然此代码删除了闭包:
function addHandler() {
var clickHandler = function() {
this.style.backgroundColor = 'red';
};
(function() {
var el = document.getElementById('el');
el.onclick = clickHandler;
})();
}
Run Code Online (Sandbox Code Playgroud)
我看不出第二个如何解决关闭问题.为什么代码不会el.onclick = clickHandler
创建一个闭包?clickHandler
的this
必须与满足el
.
你的例子不正确。您链接到的文档指出,此代码块创建了一个可能泄漏内存的闭包(请注意外部函数中的变量):
function addHandler() {
var el = document.getElementById('el');
el.onclick = function() {
this.style.backgroundColor = 'red';
};
}
Run Code Online (Sandbox Code Playgroud)
您发布的两个示例都不会创建闭包(或仅创建一个空闭包),但它们使用不同的方法来避免它。
另请注意,此问题似乎仅影响 IE 的 JS 引擎。其他引擎,例如 V8 / Chrome,似乎只捕获闭包中内部函数中使用的变量,因此我希望在此代码示例中不会创建循环引用,即使会创建循环引用,它们也应该能够使用循环引用处理垃圾收集。