我偶然发现了包含以下内容的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
}
最好避免使用垃圾收集器的问题是什么?
答案 0 :(得分:1)
这个建议看起来很奇怪:req
变量引用的对象(this
将引用的对象)以及匿名函数对象(由onsuccess
保持,只要查询完成并且已经调用了回调,onerror
和onupgradeneeded
属性)就会同时被垃圾收集。
从技术上讲,req
代表对象的另一个引用;实际上它不会导致垃圾收集的任何问题"。
总结一下:它既不是"优化"并且"微优化",两者都表现平等。
答案 1 :(得分:0)
据我所知,如果您引用'req','openDb'调用范围与'onsuccess'(作为父范围)相关联,因此您创建了一个闭包。如果 - 另一方面 - 你只引用'this',那么退出函数后就可以放弃'openDb'调用范围。
可能导致混淆的是'req'引用的对象超出了'openDb'的生命周期 - 在该函数中没有使用exclusiveley。