闭包的概念:方法返回方法
意义是:1延长局部变量的使用时间,2 形成私有属性
局部变量和全局变量
局部变量外部函数是无法访问的,且函数调用后就消失。而全局变量一直存在。
而闭包的使用可以使得局部变量的值可以被外部获得,是嵌套的内部函数给什么获得什么,还是无法访问局部变量。也增长局部变量的使用寿命。
// 作用域
const a="我是全局变量";
function fun1(){
const b="局部变量";
console.log(a);
};
// fun1();//函数可以调用全局变量
// console.log(b);//局部变量外部无法方位
闭包的基本格式
函数返回函数
// 作用域
const a="我是全局变量";
function fun1(){
const b="局部变量";
console.log(a);
};
// fun1();//函数可以调用全局变量
// console.log(b);//局部变量外部无法访问
console.dir(fun1)
闭包使用的意义和作用
延长局部变量的使用时间,外部可以获取函数内的局部变量
// 闭包
// 其作用是让另一个函数拿到另一个函数中的局部变量
//本质是局部变量的常住,延长了变量的生命周期
function out(){
const a1=111;
const a2=222;
return function inner(){
return a1;
}
};
// 命名变量的时候 函数要加()
const out_item= out();
// out_item是一个函数,函数要调用需要加圆括号
console.dir(out_item);// 返回对象的具体属性
console.log(out_item);// 返回的是一个函数 ƒ inner(){ return a; }
console.log(out_item());//111
形成私有属性
形成私有属性,各个局部变量之间不相互影响。Vue的插件data()是函数就是利用闭包,形成私有属性。像ES6中的class也是形成之间的私有属性。
私有属性可以理解为虽然名字都相同,但是属性存储的内存是不同的,不相互影响
制作一个加法器理解闭包的私有属性
// 制作一个加法器,理解私有属性
function counter(){
let num =0;
function change(a){
num +=a;
};
return{
add:function(){change(1)},
reduce:function(){change(-1)},
value:function(){return num}
}
}
let counter1= counter();
let counter2 = counter()
counter1.add()
console.log(counter1.value());//1
console.log(counter2.value());//0
console.dir(counter1);
console.dir(counter2)