今天学习js,接触到了闭包,觉得是一个很有趣的东西,故以此记录一下。
- 对于js,我们知道,程序中的任何一个函数,都能访问到其全局变量,如片段1。
片段1
<script>
let count = 0; // 全局变量
function fn() {
count ++;console.log(`函数被调用${count}次`);
}
let re1 = fn, re2 = fn;
re1();
re1();
re2();
</script>
- 但有人并不满足于此,他们认为平级调用是一件很危险的事,于是思考如何由外部访问内部元素,如片段2,仅仅将片段1的代码,封装于函数中,但很明显,这并不满足要求,依然是平级调用。
片段2
<script>
function outer(now) {
let count = 0; // 全局变量
console.log(`outer被${now}调用`);
function fn() {
count ++;
console.log(`函数被调用${count}次`);
}
let re1 = fn, re2 = fn;
re1();
re1();
re2();
}
outer(1);
</script>
- 于是他们利用,将函数传递出去,实现外部调用,这便是我所理解的闭包,如片段3。
片段3
<script>
function outer(now) {
let count = 0; // 全局变量
console.log(`outer被${now}调用`);
function fn() {
count ++;
console.log(`函数被${now}调用${count}次`);
}
return fn;
}
let re1 = outer(1), re2 = outer(2);
outer(3)();
outer(4)();
re1();
re1();
re2 = re1;
re2();
re1();
</script>
- 最后问一个小问题,如果其他js文件通过某种方式得以调用片段1中函数,这是否也可以称为闭包?也就是说,实际上每个js文件都是闭包?