hand
_1_11_47
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 17:19:17
在 JavaScript 的世界里,函数是一等公民,而闭包则是其中一个既强大又有些神秘的特性。今天,就让我们一起揭开闭包的神秘面纱,了解它的概念与形成条件。
简单来说,闭包是指有权访问另一个函数作用域中变量的函数。听起来有点抽象,我们来看一个例子。
function outerFunction() {
let outerVariable = '我来自外部函数';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
let closure = outerFunction();
closure(); // 输出:我来自外部函数
在这个例子中,outerFunction
内部定义了一个变量 outerVariable
和一个内部函数 innerFunction
。innerFunction
可以访问 outerFunction
中的 outerVariable
变量。当 outerFunction
执行完毕后,它返回了 innerFunction
,并将其赋值给了 closure
变量。此时,虽然 outerFunction
的执行上下文已经销毁,但 closure
这个函数依然可以访问 outerVariable
变量,这就是闭包的神奇之处。
闭包的形成需要满足以下几个条件:
必须有一个内部函数嵌套在外部函数内部。就像上面的例子中,innerFunction
嵌套在 outerFunction
内部。
内部函数必须引用了外部函数的变量或参数。如果内部函数没有引用外部函数的变量,那么就不存在闭包。
function outer() {
let num = 10;
function inner() {
let localNum = 20;
console.log(localNum); // 这里没有引用外部函数的变量,不存在闭包
}
return inner;
}
外部函数必须返回内部函数,这样才能在外部函数执行完毕后,依然可以通过返回的内部函数访问外部函数的变量。
下面我们用一个表格来总结闭包的形成条件:
| 条件 | 说明 |
| —— | —— |
| 函数嵌套 | 内部函数必须嵌套在外部函数内部 |
| 内部函数引用外部函数的变量 | 内部函数需要引用外部函数的变量或参数 |
| 外部函数返回内部函数 | 外部函数返回内部函数,以便在外部访问内部函数 |
闭包在实际开发中有很多应用场景,比如实现私有变量和方法。
function counter() {
let count = 0;
return {
increment: function() {
count++;
return count;
},
decrement: function() {
count--;
return count;
}
};
}
let myCounter = counter();
console.log(myCounter.increment()); // 输出:1
console.log(myCounter.increment()); // 输出:2
console.log(myCounter.decrement()); // 输出:1
在这个例子中,count
变量是 counter
函数的私有变量,外部无法直接访问。通过返回的对象中的 increment
和 decrement
方法,我们可以间接操作 count
变量,实现了数据的封装和保护。
闭包是 JavaScript 中一个非常重要的特性,掌握了闭包的概念和形成条件,我们就能更好地利用它来解决实际问题,写出更加优雅和高效的代码。希望通过这篇文章,你对闭包有了更深入的理解。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~