另一种调用方式

另一种调用方式

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        function f1(){
            var n=999;
            nAdd=function(){
                n++;
            };
            function f2(){
                alert(n);
            }
            return f2;
        }
        f1()();
        nAdd();
        f1()();
    </script>
</body>
</html>

老师,为什么这个代码两次弹出都是999,这种调用方式究竟是怎么执行的啊

正在回答

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

2回答

你好同学,就是顺序执行的。弹出两次999是因为函数在执行完毕后就会自动销毁,那么它里面的变量n也就销毁。当再次调用函数的时候,又会重新定义变量n并初始化,所以弹出两次999。 

而课程中讲解的闭包就是为了实现局部变量n也可以保存在内存中。闭包利用的就是把函数内部的子函数f2赋值给全局变量,参考如下:

全局变量在代码运行的过程中是不会销毁的,那么它用到的值,即函数f2就不会销毁。f2所在的作用域f1也就不会销毁,那么f1中的变量就能保存在内存中了。所以第一次定义的n为999就会保存在内存中,然后执行n+1为1000之后也可以保存在内存中哦。

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

祝学习愉快,望采纳。

  • 光aaaaand影 提问者 #1
    那老师,如果f1中声明了一个变量var m=10;但f2中并没有调用那么m 还会和n一样保存在全局变量中不被销毁吗?
    2019-08-28 12:53:23
好帮手慕夭夭 2019-08-28 16:13:06

你好同学,会销毁的。因为在垃圾回收机制中,函数中的局部变量如果没有被任何闭包函数所引用,这些局部变量在函数运行完成后就会被回收了。即因为f2依赖与f1中的变量n,所以局部变量n被保存下来了,但是f2中没有用到的变量,会销毁的。

祝学习愉快,望采纳。

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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