JavaScript闭包浅谈
2018-12-30 本文已影响3人
费莱姆
一.闭包
1、什么是闭包
闭:闭合,关闭,封闭。
包:包裹,包起来。
一个具有封闭的对外不公开的, 包裹结构, 或空间。
2.js中的闭包:就是函数。
3.闭包的原理就是作用域访问原则
上级作用域无法直接访问下级作用域中的变量。
function f1(){
var num = 123;
function f2(){
console.log(num);
}
f2(); //123
}
f1(); //无法访问
4.闭包要解决什么问题?
a.闭包内的数据不允许外界访问。
b.要解决的问题就是间接访问该数据。
//函数的每次调用,返回的对象都是新的 每次都不一样
function foo () {
var num = 123;
return num;
}
var x = foo();
console.log(x); //123
var y = foo();
console.log( x === y ); //undeifnd
//使用return关键字将函数内部的数据返回,这个数据只能被使用一次
function foo(){
var num = 123;
return num;
}
var x = foo();
5.闭包基本模式
在外部函数(foo)内创建函数(inner),在这个内部函数(inner)中,可以操作foo中的数据
将外部函数的返回值设置为内部函数
在外部调用外部函数(foo),就可以接受到返回值(内部函数)
使用这个内部函数,就可以在外部对外部函数里的变量进行修改
二.
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());
2.使用对象返回多个方法,来获取并设置值
function foo() {
var name = "高金彪";
var gender = "female";
return {
getName:function () {
return name;
},
setName:function(value){
name = value;
return name;
},
setGender:function(value){
gender = value;
// return gender;
},
getGender:function(){
return gender;
}
};
}
var obj = foo();
console.log(obj.getGender());
console.log(obj.setGender("雄"));
// console.log(obj.getGender());
3.闭包的作用
最基本的作用:可以通过闭包返回的函数或者方法,来修改函数内部的数据
创建一个私有的空间,保护数据
外部想要访问数据,只能通过函数提供的方法
在提供的方法中,我们可以设置一些校验逻辑,让数据变得更加安全
function foo(){
var name = "小明";
var badLevel = -10;
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;
}
}
}
//
var obj = foo();
// obj.setName("金彪");
obj.setBadLevel(obj.getBadLevel() * -1 * Math.pow(10,1));
console.log(obj.getBadLevel());