1. 闭包概念
- 函数作用域是封闭的,独立的,外部执行环境访问不了的
- 闭包,有权访问另一个函数作用域中的变量的函数
- 闭包是一个函数,且存在于另一个函数当中,可访问父级函数的变量,且不会被销毁
function person(){
var name = '有鱼';
function cat(){
console.log(name);
}
return cat;
}
var per = person();// per的值就是return后的结果,即cat函数
per();// 有鱼 per()就相当于cat()
per();// 有鱼 同上,而且变量name没有销毁,一直存在内存中,供函数cat调用
per();// 有鱼
2. 闭包原理
- 闭包的实现原理,其实就是利用了作用域链的特性
作用域链就是在当前执行环境下访问某个变量时,如果不存在就一直向外查找,最终找到最外层的全局作用域。这样形成一个链条。
例如:
var age = 18;
function cat(){
age++;
console.log(age);// cat函数内输出age,该作用域没有,则向外层寻找,结果找到了,输出[19];
}
cat();//19
// 如果我们再次调用时,结果会一直增加,也就变量age的值一直递增
cat();//20
cat();//21
cat();//22
但是,全局变量还容易被人修改,比较不安全。为了解决变量污染问题,那就是把变量封装到函数内,让它成为局部变量。
function person(){
var age = 18;
age++;
console.log(age);
}
person();// 19
person();// 19
// 这里又出现问题了,每次调用函数person,进入该作用域,变量age就会重新赋值为18,所以cat的值一直是19
// 所以需要做一下调整
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在函数内部,不易修改和外泄,相对来说比较安全。
闭包作用
作用:
- 隐藏变量,避免全局污染
- 读取函数内部变量
缺点
- 导致变量不会被垃圾回收机制回收,造成内存消耗
- 不恰当使用闭包可能会造成内存泄漏问题
垃圾回收机制回收: JS规定在一个函数作用域内,程序执行完以后变量就会被销毁,这样可节省内存;
使用闭包时,因为返回的函数,一直保留了对这个变量的引用,所以变量不会被销毁。