老师,请帮忙解析下这个题目,谢谢

老师,请帮忙解析下这个题目,谢谢

相关代码:

<script>
        function Timer() {
            this.s1=0;
            this.s2=0;

            // 箭头函数
            setInterval(() => this.s1++, 1000);

            // 普通函数
            setInterval(function () {
                this.s2++;
            },1000)
        }
        let timer=new Timer();
        setTimeout(()=>console.log('s1',timer.s1),2000);
        setTimeout(()=>console.log('s2',timer.s2),2000);
    </script>

问题描述:

老师,请问 箭头函数中,this向外查找,所以this指实例,this.s1每秒能++,2秒后输出3,

但是普通函数中,this指向window对象,为何2秒后输出的是0而不是undefined呢,这里弄不明白,请帮忙分析下,谢谢

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

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

1回答
好帮手慕慕子 2022-06-22 10:02:39

同学你好, 问题解答如下:

1、因为console.log语句中,输出的是timer.s2, 即:Timer实例化对象timer上的s2属性,所以结果为0,如下:

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

2、关于this的理解是对的,如果想要测试,可以直接访问window对象的s2,示例:

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

由于一开始window对象上没有s2属性,默认值为undefined,经过++运算后,返回结果为NaN,所以最终输出window.s2的结果为NaN。

祝学习愉快~

  • 提问者 慕码人0290569 #1

    老师,我是想问它为什么是0?普通函数中的定时器是一次也不执行吗?

    2022-06-22 10:37:32
  • 提问者 慕码人0290569 #2

    我知道了,普通函数的定时器是只跟window中的s2有关,timer中的s2始终是0

    2022-06-22 10:41:41
  • 好帮手慕慕子 回复 提问者 慕码人0290569 #3

    理解是对的,祝学习愉快~

    2022-06-22 11:15:39
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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