闭包简单理解: 需要重复循环使用一些变量但该变量又不想让其他方式污染(私有变量)
闭包复杂理解:
1. 首先我们需要理解每次函数创建时都会创建临时内存,在函数调用结束就会被释放
2. 我们闭包即为在一个函数中返回值为内部函数,在调用完毕以后会清空内部函数自身的临时内存 但 不会清空包裹他的父级函数的内存,这时即可对父级函数的局部变量重复操作使用.
(因内部函数引用并保护了外层函数的作用域对象导致外层函数的作用域无法释放所以形成了闭包)
3. 只能重复使用父级函数的局部变量, 内部函数所声明的局部变量仍然会在每次调用完毕后被销毁
闭包的声明: 声明一个函数包裹变量并return返回一个内部函数 或 返回对象中包含多个函数方法
闭包的调用: 声明一个变量初始化赋值函数后即可反复调用(多次声明不相互影响)
返回一个内部函数方法示例:
// 声明闭包 Cat
function Cat(){
var age = 0
return function(){
return ++age;
}
}
// 声明两个变量保存闭包Cat
var oneCat = Cat();
var twoCat = Cat();
// 重复多次调用并打印数据
console.log(oneCat()) //打印结果: 1
console.log(oneCat()) //打印结果: 2
console.log(twoCat()) //打印结果: 1
console.log(twoCat()) //打印结果: 2
// 以上结果体现了声明以后两个变量内的数据互不干扰
返回对象中包含多个函数方法示例:
// 声明闭包 Cat
function Cat(){
var name,age;
// 使用对象返回多个函数方法
return {
log:function(){ console.log(age,name); },
setName(value){ name = value; },
setAge(value){ age = value; }
}
}
// 同时声明两个变量来保存闭包结果
var blackCat = Cat();
var redCat = Cat();
// 同时给两个变量赋值不同数值
redCat.setName('小红');
redCat.setAge(11);
blackCat.setName('小黑');
blackCat.setAge(16);
// 同时打印数据
redCat.log();
blackCat.log();
// 数据结果应为(结果体现了声明以后两个变量内的数据互不干扰)
// redCat打印: 11 小红
// blackCat打印: 16 小黑