什么是闭包
一个函数能够读取另一个函数内部的变量,该函数就是闭包。
闭包的主要作用
设计出不暴露的私有变量和方法
实例:
function outer() {
var y = 10;
return function () {
return ++y;
}
}
var o = outer();
o(); // 11
o(); // 12
以上实例中,y是只能通过outer()来访问。
闭包造成的内存泄漏
function outer () {
let dom = document.getElementById('mdiv')
return function () {
console.log(dom.innerHTML)
}
}
let inner = outer()
let dom = document.getElementById('mdiv')
document.removeChild(dom)
// dom虽然被移除了,但在他的对象还被inner所引用。
// 如果inner永远存在(比如被做成了全局变量)那么mdiv这个dom永远会存在
正确的写法应该是
function outer () {
let dom = document.getElementById('mdiv')
let innerHTML = dom.innerHTML
dom = null
return function () {
console.log(innerHTML)
}
}
function outer () {
var x = 10;
var y = 20;
return function () {
return x;
}
}
var x = outer()();
以上闭包中,y虽然没有被使用到,但在旧的浏览器中他可能不会被gc回收掉!现代浏览器则没有这种问题。
具体看:https://stackoverflow.com/questions/24468713/javascript-closures-concerning-unreferenced-variables