1 什么是闭包?
什么是闭包?
MDN的官方解释:
闭包是函数和声明该函数的词法环境的组合
更通俗一点的解释是:
内层函数, 引用外层函数上的变量, 就可以形成闭包
需求: 定义一个计数器方法, 每次执行一次函数, 就调用一次进行计数
let count = 0
function fn () {
count++
console.log('fn函数被调用了' + count + '次')
}
fn()
这样不好! count 定义成了全局变量, 太容易被别人修改了, 我们可以利用闭包解决
闭包实例:
function fn () {
let count = 0
function add () {
count++
console.log('fn函数被调用了' + count + '次')
}
return add
}
const addFn = fn()
addFn()
addFn()
addFn()
2.闭包的作用
2.1提升变量的生命周期.
//1.闭包的作用01-提升变量的生命周期.
//就是说可以在函数外部访问函数内部的局部变量.
//2.变量生命周期: 从变量的声明到变量的回收.
//2.1 局部变量:从声明他开始到 声明他的那个函数执行完毕结束.
functiontest(){
varnum1;
console.log('哈哈');
num1=10;
console.log('呵呵');
console.log(num1);
}
test();
console.log(num1);//报错了 num1 is not defined, 因为变量已经被回收了
//2.2 全局变量:
//从声明出来开始,到程序结束(页面关闭).
//3.提升变量的生命周期.
//本来要回收的,结果没有回收.
functiontest(){
varnum1=10;
functiontest2(){
console.log(num1);
}
returntest2;
}
varfn=test();//调用test函数,会有一个函数作为返回值.就是test2函数.
fn();//调用fn,相当于调用test2函数.
2.2 提供有限的访问权限
//1.闭包的作用02-提供有限的访问权限.
functiontest() {
varnum=10;
functiongetNum() {
returnnum;
}
functionsetNum(value) {
//这里是一个函数,既然是函数就可以在这里写任意的代码.
//就可以写对这个num做赋值逻辑过滤的代码
if(value>=0&&value<=140) {
num=value;
}
}
return{
getNum:getNum,
setNum:setNum
}
}
varobj=test();//调用test函数,会返回一个对象,这个对象里面有2个方法: 一个是getNum,一个是setNum
obj.setNum(1000);
console.log(obj.getNum());
2.3 声明私有属性
//闭包的作用03-可以声明私有属性
//01:以前写构造函数
functionStudent(name,age){
this.name=name;
this.age=age;
}
//实例化学生对象: name和age等这些属性 可以直接对象访问.
vars1=newStudent('龙翔',20);
console.log(s1.name);
console.log(s1.age);
//02: 声明私有属性的构造函数
functionStudent(name){
varage=10;//局部变量age,外面不能直接访问
this.name=name;
//对age做操作的方法
this.setAge=function(value){
//判断
if(value>=0&&value<=140){
age=value;
}
}
this.getAge=function(){
return"我的年龄不方便透露哦..."
}
}
//实例化一个学生对象: 学生对象不能访问age, 必须要通过setAge()方法和getAge()方法来访问.
vars1=newStudent('豆蔻');
console.log(s1.name);
s1.setAge(20);
console.log(s1.getAge());//20
\