我到this document说这里发生了关闭:
function addHandler(){
document.getElementById('el').onclick = function(){
this.style.backgroundColor = 'red';
};
}
虽然此代码删除了闭包:
function addHandler() {
var clickHandler = function() {
this.style.backgroundColor = 'red';
};
(function() {
var el = document.getElementById('el');
el.onclick = clickHandler;
})();
}
我看不出第二个如何解决关闭问题。为什么el.onclick = clickHandler
处的代码不能创建闭包?必须使用clickHandler
来履行this
el
。
答案 0 :(得分:2)
你的例子不正确。您链接到的文档指出此代码块会创建一个可能泄漏内存的闭包(请注意外部函数中的变量):
function addHandler() {
var el = document.getElementById('el');
el.onclick = function() {
this.style.backgroundColor = 'red';
};
}
你发布的两个例子都没有创建一个闭包(或者只是一个空的闭包),但它们使用不同的方法来避免它。
另请注意,此问题似乎仅影响IE的JS引擎。其他引擎,如V8 / Chrome,似乎只捕获闭包中内部函数中使用的变量,所以我希望在这个代码示例中不会创建循环引用,即使它们应该是能够使用循环引用处理垃圾收集。
答案 1 :(得分:2)
我无法看到第二个如何解决关闭问题。
它没有。你还有一个关闭。虽然没有使用封闭的变量。
你可以重写它以避免使用这样的闭包:
var clickHandler = function() {
this.style.backgroundColor = 'red';
};
function addHandler() {
var el = document.getElementById('el');
el.onclick = clickHandler;
}
此外,您可以使用函数声明而不是函数表达式更改clickHandler
。
必须使用clickHandler
来完成
this
el
。
不,它没有。如果您要使用闭包,则可以使用el
而不是this
。
this
的值取决于函数如何调用。原始代码中的闭包没有任何意义。当对元素触发事件处理程序时,this
将是元素。
答案 2 :(得分:2)
我不认为您正确阅读了您所引用的文档。如果您在外部范围内有变量,那么问题就是没有关于'这个'的关闭引用。因此,如果您使用var el = ...
变量,那将在IE中创建一个闭包。但是在你的第一个snipet你不使用变量,所以你很高兴。
正如他们在mdn上所说:"这个问题有很多解决方法。最简单的是不使用el变量。"