不明白javascript闭包中的一个知识点

发布于 2022-09-11 21:15:02 字数 698 浏览 19 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

尐籹人 2022-09-18 21:15:02
<!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();//返回fn2整个函数,而fn2里面的b引用的是fn1里面的b
        result();//执行fn2函数,b=234+1,然后打印b=235,
        result();//再执行fn2函数【此刻发现fn1的b一直在result(实际上是fn2)被引用(形成闭包),b无法释放,b保留了235值】,b=235+1,然后打印b=236
        result();//如此类推
        result();
    </script>
</body>
</html>
失退 2022-09-18 21:15:02

因为fn1已经被执行了啊, 所以result已经是fn2了, 每次都在执行fn2, 当然也就不会重置b

再见回来 2022-09-18 21:15:02

你没发现,fn1是返回了一个fn2吗?
var result=fn1() 这个时候的result也就相当于fn2了。
然后你再执行result()不就相当于fn2()?

  • 打印出来的result

clipboard.png

诗化ㄋ丶相逢 2022-09-18 21:15:02
fn1()() //235
fn1()() //235
fn1()() //235
fn1()() //235
番薯 2022-09-18 21:15:02

f1函数只执行了一次,初始化了一次b,后面执行f2只是b++,没有初始化,所以值一直往上加

ぶ宁プ宁ぶ 2022-09-18 21:15:02

楼上他们已经回答的比较详细了,
一句话总结就是 你下面几个result()执行的时候, 不会执行var b = 234 这句代码了; 你应该理解的误区在这儿. 照你的意思理解, 确实输出的不合逻辑.result执行的时候 只是执行了fn2这个函数, 不再走var b = 234 这句了;
这么理解是不是符合逻辑了. 多花时间理解函数吧. 楼上已经输出result了.可以好好看一下

泛泛之交 2022-09-18 21:15:02

便于理解,简单一些说,
1、fn1()执行之后会返回一个function 也就是fn2 ,赋值给了result
2、这个时候的fn2 是 没有被销毁的,因为他的引用次数 > 0, 他被result 引用着
3、fn2 又引用了b, 所以b也没有被销毁
4、你每次运行result -> 也就是在运行fn2 -> 所以一直操作的也是这个一直没被销毁的b
5、所以 你看到控制台的数值就一直在增加,因为b 一直没有被销毁,且每次调用fn2 都会对其进行++操作

水波映月 2022-09-18 21:15:02
return fn2;

会执行fn2函数,此时fn1形成闭包,累加是因为fn2对b有引用

<逆流佳人身旁 2022-09-18 21:15:02

闭包会缓存数据 var result=fn1();
result=function fn2(){

            b++; //此时b=235
            console.log(b)
        }

每次调用b都会累加

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文