1. 什么是闭包?
通俗来讲就是函数外部中的作用域能够访问函数内部中的变量,例:
var a = 123;
function fn1(){
var b = 234;
function fn2(){
console.log(b);
}
return fn2;
}
var result = fn1();
result(); // 234
console.log(b) // b is not defined
//1.闭包就是fn2,即能够读取其他函数内部变量的函数
//2.定义在一个函数内部的函数
//3.闭包最大的特点:就是他可以记住诞生的环境,比如fn2记住了它诞生的环境fn1,
//所以fn2中可以得到fn1中内部变量
本质上:闭包就是函数内部和函数外部链接的一座桥梁
2. 闭包的用途
1.通过闭包制作计数器
作用:读取函数内部的变量,这些变量始终在内存中
ps:在使用闭包的时候小心内存泄漏(内存未释放或无法释放)
function a(){
var start = 0;
function b(){
return start++;
};
return b;
}
var inc = a();
console.log(inc()) // 0
console.log(inc()) // 1
console.log(inc()) // 2
//释放当前变量
inc = null
2.闭包能够封装对象的私有属性和方法
function(){
//私有属性
var age = n;
//私有方法
function setAge(n){
age = n;
}
function getAge(){
return age
}
return {
name:name,
setAge:setAge,
getAge:getAge
}
}
var p1 = Person( 'mjj' );
p1.setAge(18);
console.log(p1.getAge()); // 18
p1 = null
3.闭包的注意点
使用闭包使得函数中的变量始终在内存中,内存消耗很大,所以不能滥用闭包,否则会造成页面性能问题
4.总结
1.每个父函数调用完成,都会形成新的闭包,父函数中的变量始终会在内存中,相当于缓存,小心内存泄漏
2.闭包需要满足三个条件:
1)函数的嵌套 2)访问所在的作用域 3)在所在作用域外被调用