JS 对于闭包的理解不够彻底?
JS代码
function fn() {
var num = 3;
return function() {
var n = 0;
n++;
num++;
console.log('n=' + n);
console.log('num=' + num);
}
}
var fn1 = fn();
fn1(); // 1 4
console.log("------");
fn1(); // 1 5
变量 num 在函数执行完毕后没有被销毁,当我第二次调用 fun1
的时候输出 num=5,而变量 n 每次执行时都会创建一个新的,导致两次调用输出都是 1,这是为什么?同样都是函数内部的变量变量 num 在执行过程中是如何被保留下来的?
回复
1个回答
test
2024-06-20
当一个函数可以通过某种方式访问其它函数内部变量时,闭包就形成了
你每次执行fn1
,里面的var n = 0
,都把n
初始化为0
了。
fn
其实也遵循这个规律,函数都这样。
但是,你的fn
在复赋值给fn1
之后,就没有再执行了。所以里面的num
没有被重新赋值,又由于闭包的作用让它不会被销毁(语言引擎特性),使得你在每次调用fn1
都可以访问到它累积起来的值。
回到开头的话,你的fun1
就有能力访问fn
内部的num
。也就形成了闭包。闭包的特性就使得num
不会被销毁(因为外面有函数可能会访问num
,不销毁才合理)。
function fn() {
var num = 3;
// 这里加一个console.log
console.log('outer num', num);
return function() {
var n = 0;
n++;
num++;
console.log('n=' + n);
console.log('num=' + num);
}
}
// 连续调用两次看看,num的表现和n是一样的
fn()
fn()
附一下阮一峰的闭包文章(阮一峰,我的hero!)
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容