JS中的闭包

本文最后更新于:1 小时前

闭包是什么?

一个函数和对其周围状态(lexical environment, 词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包。

也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域

在JS中,每创建一个函数,闭包就会在函数创建的同时创建出来,作为函数内部与外部连接起来的一座桥梁

1
2
3
4
5
6
7
8
function init(){
var name = "Mozilla"
function displayName(){
alert(name);
}
displayName();
}
init();

displayName()函数没有自己的局部变量。然后,由于闭包的特性,他可以访问到外部函数的变量

《你不知道的JavaScript》: 当函数可以记住并访问所在的词法作用域时,就产生了闭包

词法作用域:指的是定义表达式并能被访问的区间,也就是一个声明(定义变量、函数等)的词法作用域就是它被定义时所在的作用域

闭包的经典使用场景

  • return 回一个函数

  • 函数作为一个参数

  • 循环赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var data = []
for(var i = 0; i < 5; i++){
data[i] = function(){
console.log(i);
}
}
for (var i = 0; i < 5;i++){
data[i]();
}
//0 1 2 3 4
var data = []
for(let i = 0; i < 5; i++){
data[i] = function(){
console.log(i);
}
}
for (var j = 0; j < 5;j++){
data[j]()
}
//0 1 2 3 4
var data = []
for (let i = 0;i < 5;i++){
data[i] = function(){
console.log(i);
}
}

for(var j = 0; i = 9; j < 5; j++){
data[j]();
}
//0 1 2 3 4
  • 防抖、节流

闭包的危害

  • 容易造成内存泄漏

内层函数调用的外部变量无法得到释放,会产生内存泄漏

如果不是某些特定任务需要使用闭包,在其他函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响


JS中的闭包
https://blog.seasalt-haiyan.top/2024/04/18/JS中的闭包/
作者
Xu Haoyang
发布于
2024年4月18日
更新于
2024年4月19日
许可协议