闭包形成原因:外层函数调用后,外层函数的作用域对象被内层函数引用着无法释放,形成了闭包对象。
闭包缺点:闭包比一般的函数多占用一块内存——(外层函数的作用域对象)
什么时候使用闭包:重用数据,又不想污染全局作用域的时候。
如何释放闭包: 一旦一个闭包不再使用,应该尽快释放!如: 孩子=null
举例:定义一个函数替小孩儿保管零花钱:
小孩儿每花一笔钱,就从总钱数中减去花的钱,提示余额。
问题: 比如有1000元总金额,保存在哪里?要么存在全局: 虽然可以实现功能,但是极易被篡改!
闭包3步:
1. 定义外层函数包裹要保护的变量和内层函数
function 父母(){
//在外层函数父母内定义要保护的变量
var total=1000;
//2. 外层函数将内层函数返回到外部
//生出 孩子函数
return function(money){
//要么存在局部: 虽然不会被篡改,但是不可重用
total-=money;
console.log(`花了${money}元,还剩${total}元`)
}
}
//强调: 函数只有调用才执行,才能获得返回结果
//3. 调用者,必须调用外层函数,才能获得函数返回的内层函数。
var 孩子=父母();
//花了100
孩子(100);//希望剩900(注:别人写的代码,可能不能篡改我的变量)
//又花了100
孩子(100);//希望剩800
//又花了100
孩子(100);//希望剩700
图解(东哥画的图):1.创建父母保护的变量和内层函数
2.return函数创建作用域链,指向父母函数的作用域链,父母函数作用域链无法释放
3.孩子指向等于null时,可以释放孩子的作用域链,释放闭包
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。