不明白javascript闭包中的一个知识点
js的闭馁一点不明白,var result=fn1();
fn1的第一句是var b=234,每次应该都执行这一句呀,怎么结果会累加呢??
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
var a=123;
function fn1(){
var b=234;
function fn2(){
b++;
console.log(b)
}
return fn2;
}
var result=fn1();
result();
result();
result();
result();
</script>
</body>
</html>
结果
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
因为fn1已经被执行了啊, 所以result已经是fn2了, 每次都在执行fn2, 当然也就不会重置b
你没发现,fn1是返回了一个
fn2
吗?var result=fn1()
这个时候的result
也就相当于fn2
了。然后你再执行
result()
不就相当于fn2()
?f1
函数只执行了一次,初始化了一次b
,后面执行f2
只是b++
,没有初始化,所以值一直往上加楼上他们已经回答的比较详细了,
一句话总结就是 你下面几个result()执行的时候, 不会执行var b = 234 这句代码了; 你应该理解的误区在这儿. 照你的意思理解, 确实输出的不合逻辑.result执行的时候 只是执行了fn2这个函数, 不再走var b = 234 这句了;
这么理解是不是符合逻辑了. 多花时间理解函数吧. 楼上已经输出result了.可以好好看一下
便于理解,简单一些说,
1、fn1()执行之后会返回一个function 也就是fn2 ,赋值给了result
2、这个时候的fn2 是 没有被销毁的,因为他的引用次数 > 0, 他被result 引用着
3、fn2 又引用了b, 所以b也没有被销毁
4、你每次运行result -> 也就是在运行fn2 -> 所以一直操作的也是这个一直没被销毁的b
5、所以 你看到控制台的数值就一直在增加,因为b 一直没有被销毁,且每次调用fn2 都会对其进行++操作
会执行fn2函数,此时fn1形成闭包,累加是因为fn2对b有引用
闭包会缓存数据 var result=fn1();
result=function fn2(){
每次调用b都会累加