闭包是什么?
一个具有封闭的不对外公开的包裹或空间。
Js中的闭包与其原理
js中的闭包就是函数,原理就是函数的作用域访问原则,上级作用域无法访问下级作用域中的变量。
具体代码如下:
function f1(){
var num = 123;
function f2(){
console.log(num);
}
f2();
}
该代码运行后,控制台并不会打印什么东西。因为f1无法访问下级作用域f2中的变量。
闭包存在的问题及解决方案。
1.闭包内的数据不允许外界访问
2.要解决的问题就是间接访问该数据
具体代码如下
function foo () {
var num = 123;
return num;
}
var x = foo();
console.log(x);
var y = foo();
console.log( x === y );
//用来说明函数的每次调用,返回的对象都是新的 每次都不一样
function foo(){
var obj = {
name:"金克丝",
nickName:"暴走萝莉"
}
return obj;
}
var obj1 = foo();
var obj2 = foo();
console.log(obj1 == obj2);
使用return关键字将函数内部的数据返回,这个数据只能被使用一次。
闭包的基本原则
在外部函数(foo)内创建函数(inner),在这个内部函数(inner)中,可以操作foo中的数据
将外部函数的返回值设置为内部函数
使用这个内部函数,就可以在外部对外部函数里的变量进行修改。
上文说道,闭包的数据无法通过外界访问修改,如果利用return变量的方式,不能修改只能访问。
1.函数内部的函数中可以访问该函数中的变量
2.但是我们需要在函数外部去访问函数中变量
function foo(){
var num = 100;
return function(a){
//1.如果传参数,这里的a肯定不是Undefined,所以条件判断为true
if(a!==undefined){
num = a;
}
else{
//如果不传参,代表要获取这个值,直接return
return num;
}
}
}
var func = foo();
//设置值
func(789);
//理想状态下的获取值
var x = func();
console.log(x);
func(987);
console.log(func());
用闭包来修改多个数据
function foo{
var name= "卡卡";
var age = 26;
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())
}
}
闭包的作用
闭包的作用
最基本的作用:可以通过闭包返回的函数或者方法,来修改函数内部的数据
创建一个私有的空间,保护数据
外部想要访问数据,只能通过函数提供的方法
在提供的方法中,我们可以设置一些校验逻辑,让数据变得更加安全
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;
}
}
}
var name = "";
var age = 19;
//张二狗
name = "二狗";
//隔壁老王
name = "隔壁老王到此一游";