定义:闭包是一个函数,它有权访问另一个函数作用域中的变量。常见创建闭包的方式是在一个函数内创建另一个函数。
如:在函数A中创建函数B,函数B可以访问到函数A中的变量,那么函数B计时闭包:
function A() {
let num = 0
function B() {
console.log(num)
}
B()
}
A()//输出0
应用:解决变量提升问题,实际上就是可以用它来创建私有变量。
es6没出来之前,用var定义变量会存在变量提升的问题
如:
for(var i=0; i<10; i++) {
console.log(i)
}
//变量i提升到外部,
console.log(i)//输出10
闭包解决:
(function () {
for(var i=0; i<10; i++) {
console.log(i)
}
})()
console.log(i)//报错 i is not defined
闭包的问题:1.闭包的this指向问题 2.内存泄漏问题
1.闭包函数在window作用域下执行,所以this指向windows
如:
var obj = {
name: "我是obj",
getName: function() {
return function() {
console.log(this.name)
}
},
output: function() {
console.log("output")
}
}
obj.getName()//无输出
obj.output()//输出output
2.闭包导致的内存泄漏
如:
function showId() {
var el = document.getElementById("app")
el.onclick = function(){
aler(el.id) //el无法释放,存在内存泄漏问题
}
}
解决方法:主动释放内存
function showId() {
var el = document.getElementById("app")
var id = el.id
el.onclick = function(){
aler(id)
}
el = null // 主动释放el
}