希望能帮给你彻底neng懂闭包

259 阅读1分钟

阅读前须知

你必选要了解函数作用域,如果不了解可以在本站搜索

闭包到底是个啥玩意,为啥总是neng不清,这一次俺让你彻底彻底neng清楚

先来个最简单的代码

let i = 0;
function f() {
	i++;
	return i;
}
console.log(f());// 1
console.log(f());// 2
console.log(f());// 3
console.log(f());// 4
console.log(f());// 5

ok,你可以看到函数f内引用了一个变量i,思考一下每次调用f函数的时候发生了什么?

如果我把这段代码用函数包裹起来呢?为了防止混淆,我们一步步来

1.包裹函数并且返回

function c(){
	let i = 0;
	return function f() {
		i++;
		return i;
	}
}

2.取消具名函数,返回匿名函数即可

function c(){
	let i = 0;
	return function () {
		i++;
		return i;
	}
}

3.接收返回值,执行代码

let f = c();

看一下最终的代码

function c(){
	let i = 0;
	return function () {
		i++;
		return i;
	}
}
let f = c();
console.log(f());// 1
console.log(f());// 2
console.log(f());// 3
console.log(f());// 4
console.log(f());// 5

和最初的代码相比,有哪些变化?

1.变量i放到了函数内,你无法在函数外继续访问到此变量了

2.但是你可以在函数c的返回值,即内部的匿名函数访问到此变量

3.函数c执行完并没有被销毁,因为它内部的变量i被f引用了,所以每次执行f()时,i的值都会发生变化并且保存起来

实际上,闭包就是函数作用域特性的一种表现形式,每个函数执行时都可以称之为闭包,只不过有的函数没有被销毁而已。

最后:忘记闭包,记住函数作用域