1 闭包的概念
有权访问另一个函数作用域中的变量的函数;一般情况就是在一个函数中包含另一个函数。
从官方定义我们知道闭包是一个函数,只不过这个函数可以访问到另一个函数的作用域。
2 闭包的原理
闭包的实现原理,其实是利用了作用域链的特性,我们都知道作用域链就是在当前执行环境下访问某个变量时,如果不存在就一直向外层寻找,最终寻找到最外层也就是全局作用域,这样就形成了一个链条。
例如:
function person(){
var age = 18;
function cat(){
age++;
console.log(age);
}
return cat;
}
var per = person();//per相当于函数cat
per(); // 19 即cat() 这样每次调用不在经过age的初始值,这样就可以一直增加了
per(); // 20
per(); // 21
变量age在函数内部,不易修改和外泄,相对来说比较安全。
3 闭包的特性
优点:
- 隐藏变量,避免全局污染
- 可以读取函数内部的变量
缺点:
- 导致变量不会被垃圾回收机制回收,造成内存消耗
- 不恰当的使用闭包可能会造成内存泄漏的问题
4 闭包的应用
需求:实现变量a 自增
代码示例:
var a = 10;
function Add3(){
var a = 10;
return function(){
a++;
return a;
};
};
var cc = Add3();
console.log(cc()); // 11
console.log(cc()); // 12
console.log(cc()); // 13
console.log(a); // 10