"这个"如何在关闭中起作用?

Gha*_*san 6 javascript

我得到了这个文件说这里有一个关闭:

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创建一个闭包?clickHandlerthis必须与满足el.

Luc*_*ero 2

你的例子不正确。您链接到的文档指出,此代码块创建了一个可能泄漏内存的闭包(请注意外部函数中的变量):

function addHandler() {
    var el = document.getElementById('el');
    el.onclick = function() {
        this.style.backgroundColor = 'red';
    };
}
Run Code Online (Sandbox Code Playgroud)

您发布的两个示例都不会创建闭包(或仅创建一个空闭包),但它们使用不同的方法来避免它。

另请注意,此问题似乎仅影响 IE 的 JS 引擎。其他引擎,例如 V8 / Chrome,似乎只捕获闭包中内部函数中使用的变量,因此我希望在此代码示例中不会创建循环引用,即使会创建循环引用,它们也应该能够使用循环引用处理垃圾收集。