闭包是一种语法特性,指在一个函数中访问了外部的自由变量
{
let count = 0;
const add = ()=> {
count += 1 //访问了该作用域外部的自由变量count
}
}
{
let money = 100;
window.getMoney= function (){ return money;}
window.use = () => { money -= 1}
window.earn = () => { money +=1 }
}
通过访问getMoney能间接获取money的值,调用use和earn会更新money的值,我们在作用域以外
无法直接访问money这个变量
闭包的应用:
const add2 = function (){
let total = 0
return function add(){
total+=1 //访问了外部作用域的total
}
add2() // 相当于调用了add(),执行了total+=1
解决的问题:
- 避免污染全局的环境
- 提供对变量的间接访问
- 维持变量,避免被垃圾回收
缺点:
使用不当会造成“内存泄漏”
function example(){
var x = {name:'x'}
var y = {name:'y',description:'----- 1000多个字符-----'}
return function fn(){
return x;
}
}
const myFn = example()
const myX = myFn() // 对于正常浏览器 y会在一段时间后消失
在example中 x被使用,但 y并没有被使用。在旧版IE中,只要某个函数中的某个变量被使用,那么该函数中的其它未被使用的变量也不会被垃圾回收。