使用"这个"在回调vs外部变量和垃圾收集器中

时间:2015-05-01 09:30:39

标签: javascript garbage-collection

我偶然发现了包含以下内容的IndexedDB example on MDN

function openDb() {
    var req = indexedDB.open(DB_NAME, DB_VERSION);
    req.onsuccess = function (evt) {
        // Better use "this" than "req" to get the result
        // to avoid problems with garbage collection.
        // db = req.result;
        db = this.result;
    };
    // Rest of code omitted for brevity
}

最好避免使用垃圾收集器的问题是什么?

2 个答案:

答案 0 :(得分:1)

这个建议看起来很奇怪:req变量引用的对象(this将引用的对象)以及匿名函数对象(由onsuccess保持,只要查询完成并且已经调用了回调,onerroronupgradeneeded属性)就会同时被垃圾收集。

从技术上讲,req代表对象的另一个引用;实际上它不会导致垃圾收集的任何问题"。

总结一下:它既不是"优化"并且"微优化",两者都表现平等。

答案 1 :(得分:0)

据我所知,如果您引用'req','openDb'调用范围与'onsuccess'(作为父范围)相关联,因此您创建了一个闭包。如果 - 另一方面 - 你只引用'this',那么退出函数后就可以放弃'openDb'调用范围。

可能导致混淆的是'req'引用的对象超出了'openDb'的生命周期 - 在该函数中没有使用exclusiveley。