什么是闭包?
闭包是作用域应用的一种特殊情况,主要有两种表现
1.函数作为返回值
function create(){
let a = 1;
return function(){
console.log(`函数作为返回值:${a}`)
}
}
let a = 0;
let getFunc = create();
getFunc(); // 1
输出的1就是a这个变量,但是a在create作用域和全局作用域都有相应的声明,这个判断机制又是怎么样的呢?
这个时候就需要引入一个自由变量的概念。
自由变量指一个变量在当前作用域没有被定义,但被使用了。此时a就是一个自由变量,自由变量会向所处函数定义的上级作用域,一层一层的寻找直到找到为止(最后到了全局作用域还没找到的话,就抛出错误)。
自由变量定义的上级作用域为create作用域,所以输出为1。
2.函数作为传入参数
function func(fn){
let b = 1;
fn();
}
function fn1(){
console.log(b);
}
let b = 0;
const fn2 = func(fn1);
fn2() //0
在这种情况下,因为fn1函数是在全局作用域里声明的,而b是在fn1里被调用,所以自由变量b所处函数定义的上级作用域为全局作用域。声明为0。
闭包的应用场景
隐藏数据
比如现在就简单做一个chace的工具,
//闭包隐藏数据 只提供API
function createChace(){
let data = {}; //闭包中的数据被隐藏 不被外界访问
return{
get(key){
return data[key]
},
set(key,val){
data[key] = val;
}
}
}
let chace = createChace();
chace.set("name","ace");
console.log(chace.get("name")); //ace
里面的data是不能被外界访问的,只能通过提供的get和set方法来进行相应操作。