作为一个学过编译原理的计算机科班学生,我想谈一谈我自己对javascript中闭包的理解。
在编译原理课程的实验部分我们的要求是实现一个SYSY编译器(一个简化版本的C语言目标为MIPS/LLVM代码),实验的一个重要部分就是实现函数调用。在MIPS实现函数调用中比较重要的部分就是传参,前4个参数我们会利用寄存器传参,后面的参数会通过栈帧来传参(将参数压栈),不管怎样,函数调用返回后就会弹栈。
但是在C语言中函数中是不允许返回一个函数的,而在javascript中可以返回一个函数。
正常的情况下,如果返回正常值,那么函数中的局部变量就会直接在弹栈中丢掉了,但是在javascript中你又返回了一个函数那么需要将新的函数压栈,在这个过程中压栈肯定不能丢掉对一些局部变量的引用,同时注意每次调用原函数的局部变量都是重新产生的,也就是在内存中每个闭包函数引用的变量是不同的(如果都是同一个变量我想也不会存在内存泄漏的问题了吧)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function test(){
let a = {
value: {
value: 1
}
};
return function(){
return a.value.value++;
}
}
let test1 = test();
console.log(test1());
let test2 = test();
console.log(test2());

上面的代码输出的结果为:

1
2
1
1