什么是闭包?
简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。
即重用一个变量,又保护变量不被污染的一种机制。
为什么需要闭包?
局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。
特点
- 占用更多内存
- 不容易被释放
何时使用?
变量既想反复使用,又想避免全局污染
如何使用?
- 定义外层函数,封装被保护的局部变量。
- 定义内层函数,执行对外部函数变量的操作。
- 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。
闭包形成的原因:
外层函数调用后,外层函数的函数作用域(AO)对象无法释放,被内层函数引用着。
闭包的缺点:
比普通函数占用更多的内存。
解决:闭包不在使用时,要及时释放。
将引用内层函数对象的变量赋值为null。
闭包实例
var name = 'Schopenhauer'
function getName () {
var name = 'Aristotle'
var intro = function() { // 这是一个闭包
console.log('I am ' + name)
}
return intro
}
function showMyName () {
var name = 'wangxi'
var myName = getName()
myName()
}
showMyName() // I am Aristotle
<script>
//1. 用外层函数包裹要保护的变量和内层函数
function outer(){
var i=1;
//2. 外层函数返回内层函数对象到外部
return function(){
console.log(i++);
}
}
//3. 调用外层函数获得内层函数对象
var getNum=outer();
//getNum:function(){ console.log(i++); }
getNum();//1
getNum();//2
i=1;
getNum();//3
getNum();//4
</script>