老师能看看我的思路哪里有问题吗

老师能看看我的思路哪里有问题吗

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <script>

        function count(){

            var num=1; //将num赋值为1

            return function(){ //返回 匿名函数

                return num++; //返回 num++ 既1++

            }

        }

        document.write(count()()+'<br/>'); //count()()调用函数内部返回的函数 此处应该是匿名函数 num++ 1

        document.write(count()()+'<br/>');//第二次调用 2

        document.write(count()()+'<br/>');//第三次调用 3

        var fn=count() //此处fn赋值给函数 count() 既 num++ 1

        document.write(fn()+'<br/>'); //只调用一次 1

        document.write(fn()+"<br/>");//只调用一次 1

        document.write(fn()+"<br/>");//只调用一次 1

    </script>

</body>

</html>


正在回答 回答被采纳积分+1

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

1回答
好帮手慕久久 2022-06-29 16:54:58

同学你好,理解有误:

1、如下代码中的多个count()(),彼此之间并没有关联,num不会相互影响:

https://img1.sycdn.imooc.com//climg/62bc0f1b09dba1af06760286.jpg

函数调用会形成独立的作用域,每调用一次就会形成一个作用域。上图代码中,3个count(),会形成3个作用域,每个作用域中,都有一个num,num初始值都是1,并且都有一个匿名函数function(){ return num++}

https://img1.sycdn.imooc.com//climg/62bc10de09d1df9307300624.jpg

再次()时,则会执行每个作用域中的匿名函数function(){ return num++},这个匿名函数,会在自己所在的作用域中查找num:

https://img1.sycdn.imooc.com//climg/62bc115b09cd46db09000684.jpg

所以三句document.write(count()()+'<br/>')的打印结果是一样的。

2、如下写法,3个fn()之间会相互干扰,因为它们操作的是同一个作用域中的num:

https://img1.sycdn.imooc.com//climg/62bc11af0913e15506200304.jpg

var fn=count()这句代码,是调用函数count,此时会创建一个作用域,而这个作用域中返回的函数function(){ return num++}则被变量fn保存起来了:

https://img1.sycdn.imooc.com//climg/62bc125a0921796706630309.jpg

下面多次调用fn,则是操作同一个作用域中的function(){ return num++}:

https://img1.sycdn.imooc.com//climg/62bc12c70919bc4d09640352.jpg

进而操作同一个num:

https://img1.sycdn.imooc.com//climg/62bc12ed098d603a09640352.jpg

所以num会累积:

https://img1.sycdn.imooc.com//climg/62bc12fa0901fee702770098.jpg

祝学习愉快!

  • 提问者 豆包侠 #1

    老师 还有个小疑问 就是前三个即使是 各自独立的作用域  那rerun后的 num++ 为什么也是num本身 1呢

    2022-06-30 17:10:26
  • 好帮手慕久久 回复 提问者 豆包侠 #2

    这和num++、++num有关系。return是返回值,当涉及到返回值的时候,num++是先返回原值,再让num加1。num的初始值是1,即原值是1,所以会把1返回,因此打印1:

    https://img1.sycdn.imooc.com//climg/62bd697509ddd2f107640245.jpg

    如下课程中讲过,可以回顾一下:

    https://class.imooc.com/lesson/768#mid=19206

    2022-06-30 17:21:59
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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