如果这样调用的话,为什么结果是相同的?

如果这样调用的话,为什么结果是相同的?

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Document</title>

</head>

<body>

<script>

    function f1(){

        var n=999;

        nAdd=function(){

            n=n+1;

        }

        function f2(){

            alert(n);

        }

        return f2;

    }

    

    var rs=f1();

    f1()();

    nAdd();

    rs();

    nAdd();

    rs();

</script>

</body>

</html>


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你好同学,解答如下:

1.第一个理解正确。

2.。第二个是说如下调用对吗?

http://img1.sycdn.imooc.com//climg/5db02d7d098f966804180177.jpg

描述的有一点问题。老师给你理一下:

并不是n被重置,这样调用后,产生3个闭包,每个闭包之间独立,每一个闭包中都会有自己的n值。nAdd执行时,第一个闭包的nAdd被覆盖,变成第二闭包的nAdd了,所以nAdd改变的是第二个闭包的值。参考如下:

http://img1.sycdn.imooc.com//climg/5db02fb009ef32c907150214.jpg

祝学习愉快,望采纳。

好帮手慕夭夭 2019-10-23 11:44:00

你好同学,在你的代码中,有两个闭包。全局变量rs不会销毁,所以下面调用f1时,返回f1内部的子函数f2 ,所以f2也不会销毁。形成一个闭包。

http://img1.sycdn.imooc.com//climg/5dafc92b09ba7d3608570057.jpg

第二个是当调用f1()()的时候,如下:

http://img1.sycdn.imooc.com//climg/5dafcc2a090b508609930083.jpg

因为第二个nAdd把第一个覆盖了,所以后面调用的都是f1()()中的nAdd。所以调用rs这个闭包的时候,n的值不会变:

http://img1.sycdn.imooc.com//climg/5dafcc78092295b910410574.jpg

祝学习愉快,望采纳。

  • 提问者 王嘉炜 #1
    rs的nAdd被f1()()的nAdd替换后,原有rs的作用域下的nAdd是不是就直接没了,无法在rs的作用域下使用nAdd方法?
    2019-10-23 14:41:55
  • 提问者 王嘉炜 #2
    rs=f1(); f1()(); nAdd(); f1()(); 如果这样调用,内部的计算过程是否是这样:f1()()执行后,rs的作用域下的nAdd函数被替换为f1()作用域下的nAdd函数,当执行nAdd函数时,n=1000,再次执行f1()()时,n被重置为999(也就是n中间其实发生过改变,但没体现出来,所以第二个f1()();调用结果依然是999)?
    2019-10-23 15:04:51
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师