什么是闭包?
闭包(closure)我们从汉字的字面意思可以理解为:
闭:封闭的 闭合 关闭
包:包裹 包裹起来的东西 包装好的一堆单件
闭包:封闭的包裹
那么在JavaScript中我们可以创造这样一个封闭空间的只有函数,初步我们就可以把函数理解为闭包。
闭包要解决的问题:
函数可以创建一个封闭的包裹结构,在函数内声明一个变量,那么按照作用域的规则在函数内部是无法访问这个变量的。那么我们在函数外部如何访问这个变量
function temp(){
var number=7;
return number;
}
var b= temp();
console.log(b);
分析:
在上面的代码中,确实可以访问到num这个函数内部的变量。但是能不能多次访问呢?
不能,因为每次访问都得重新调用一次foo函数,每次调用都会重新创建一个number=7,然后返回。
如何多次访问同一个一个变量
解决思路:
函数内的数据不能直接在函数外被访问,是因为作用域的关系,上级作用域不能直接访问下级作用域中的数据。
但是如果反过来,下级作用域可以直接访问上级作用域中的数据。那么如果在函数foo内定义一个函数,那么在这个内部函数中是可以直接访问foo中的num的。
如何间接的在函数外部修改函数内部的变量代码如下:
function temp(){
var number=7;
function inner(){
return number;
//虽然我们在函数外部不能访问函数内部的变量。
但是我们可以在函数的内部访问并且修改函数内部的变量
}
return inner;
}
var b= temp();
console.log(b());
console.log(b());
如何获取都多个变量
函数的返回值只能有一个,那按照上面的方法,我们只能对函数内部的一个数据进行操作。怎么操作函数内的多个数据呢?
可以使用对象,代码如下:
function temp(){
var number=7;
var name="zs"
function inner(){
return {
number:number,
name:name
};
//虽然我们在函数外部不能访问函数内部的变量。但是我们可以在函数的内部访问并且修改函数内部的变量
}
return inner;
}
var b= temp();
var obj=b();
console.log(obj.name);
console.log(obj.number);
如何获取和修改一个变量
前面我们只有去获取函数内部私有变量的方法那么我们要如何去修改函数的私有变量了。
列子如下:
function temp(){
var name="zs";
return {
getname:function(){
return name
},
setname:function(parameter){
name=parameter;
}
};
}
var b= temp();
var obj=b();
obj.setname("ls");
console.log(obj.getname());
闭包的基本结构
一般闭包要解决的的问题就是要想办法间接的获得函数内数据的使用权. 那么我们的可以总结出一个基本的使用模型.
1.写一个函数, 函数内定义一个新函数, 返回新函数, 用新函数获得函数内的数据
2.写一个函数, 函数内定义一个对象, 对象中绑定多个函数( 方法 ), 返回对象, 利用对象的方法访问函数内的数据
闭包可以用来做什么?
- 保护变量,为变量的设置和获取提供指定的方法,可以在设置或者获取变量的时候加一些校验的逻辑
- 为函数设置私有的数据