怎么'这"工作关​​闭?

时间:2014-08-24 10:49:08

标签: javascript

我到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

3 个答案:

答案 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变量。"