JS基础篇-闭包

什么是闭包?

闭包是作用域应用的一种特殊情况,主要有两种表现

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方法来进行相应操作。

发布了6 篇原创文章 · 获赞 0 · 访问量 126

猜你喜欢

转载自blog.csdn.net/jinbiao8246/article/details/105288023
今日推荐