demo.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function foo(){ // 闭包(函数),提供一个私有的空间。(foo()只调用一次,从而保证共用的私有空间是相同的空间)
var name = "张三"; //私有空间中的变量。foo()只能调用一次,从而保证多次setName所使用的变量是相同的变量(name)
var age = 20;
return { // 通过return内部函数,可以让外部获取内部函数,并通过内部函数来获取/修改私有空间中的内容。 (如果是多个内部函数,可以将多个内部函数封装成JSON对象返回)
getName: function () { //(内部函数) 不带参数表示获取
return name; //获取一定要有return语句。
},
setName: function (value) { //(内部函数) 带参数表示设置
name = value;
return name; // 设置时可以不用return, 这里的return是为了友好。
},
getAge:function(){
return age;
},
setAge:function (value) {
if(value < 0 ){ //设置安全措施,可以保证系统的安全性和稳定性
throw "数据非法";
}
age = value;
return age;
}
}
}
var obj = foo(); //foo()只调用一次,表示共用的是同一个私有空间(闭包)。 obj就是内部函数(或者多个内部函数封装成的JSON对象)
console.log(obj.getName());
obj.setName("高金彪");
console.log(obj.getName());
obj.setAge(22);
console.log(obj.getAge()); //多次设置和获取,都是共用的同一个私有空间
//闭包的作用
//最基本的作用:可以通过闭包返回的内部函数或者方法,来修改函数内部的数据
//创建一个私有的空间,保护数据
//外部想要访问数据,只能通过函数提供的内部方法
//在提供的内部方法中,我们可以设置一些校验逻辑,让数据变得更加安全
</script>
</head>
<body>
</body>
</html>