1.什么是闭包
一个具有封闭的对外不公开的,包裹结构,或空间,js中的闭包就是函数。
2.闭包原理
闭包的原理就是作用域访问原则,上级作用域无法直接访问下级作用域中的变量。
3.闭包要解决什么问题?
闭包内的数据不允许外界访问,要解决的问题就是间接访问该数据。
4. 使用闭包获取多个数据
function foo(){
var name = '张国荣';
var age = 18;
return function(){
return name + ":" + age;
}
}
var getName = foo();
console.log(getName());
或者返回数组形式:
function foo(){
var name = '张国荣';
var age = 18;
return [
function(){
return name;
},
function(){
return age;
}
]
}
var getName = foo();
console.log(getName[0]());
console.log(getName[1]());
或者使用对象获取:
function foo(){
var name = '张国荣';
var age = 18;
return {
getName:function(){
return name;
},
getAge:function(){
return age;
}
}
}
var obj = foo();
console.log(obj.getName());
console.log(obj.getAge());
5.使用对象返回多个方法来获取并设置值
function foo(){
var name = 'hehe';
var gender = 'male';
return {
getName:function(){
return name;
},
setName:function(value){
name = value;
return name;
},
getGender:function(){
return gender;
},
setSpeed:function(value){
speed = value;
return speed;
}
}
}
var obj = foo();
console.log(obj.getName());
console.log(obj.getGender());
obj.setName("xixi");
console.log(obj.getName());
6.闭包的作用
作用:
1 可以通过闭包返回的函数或者方法,来修改函数内部的数据
2 创建一个私有的空间,保护数据
3 外部想要访问数据,只能通过函数提供的方法
4 在提供的方法中,我们可以设置一些校验逻辑,让数据变得更加安全
function foo(){
var name = "潘明";
var badLevel = -1000000000000000000000000000000000;
return {
getName: function () {
return name;
},
setName: function (value) {
name = value;
return name;
},
getBadLevel:function(){
return badLevel;
},
setBadLevel:function (value) {
//在函数外部想要修改数据
//只能通过函数内部的方法
//我们可以在函数内部定义的这个方法里
//设置安全措施,校验之类的操作
//可以保证系统的安全性和稳定性
if(value > 0 ){
throw "你敢说我坏!!!";
}
badLevel = value;
return badLevel;
}
}
}