节流函数

节流函数

https://img1.sycdn.imooc.com//climg/6204f23e095a6d4605570526.jpg

老师这个节流函数 每次执行节流函数不是都会先把上一次的时间戳赋值为null,

 if语句中的判断 !lastEventTimestamp 不是就不起作用了吗?

正在回答

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

1回答

同学你好,同学的理解有些偏差。

具体解答如下:

这个例子中只会在第一次的时候将lastEventTimestamp赋值为null,再一次的时候lastEventTimestamp就会有值了(因为已经在if语句中进行重新赋值为now了)。所以if判断语句中!lastEventTimestamp这个条件自然就不会符合了,但是这里有个知识点。在if判断语句中条件1||条件2如果两个条件使用||(谁或谁),那么这里要注意,只要是条件符合这两个其中的某一个都会进入if语句中,如下图:

https://img1.sycdn.imooc.com//climg/6205e33e09418e4f05230202.jpg

https://img1.sycdn.imooc.com//climg/6205e35409fa469a03630118.jpg

https://img1.sycdn.imooc.com//climg/6205e37409759c2106780205.jpg

https://img1.sycdn.imooc.com//climg/6205e37a09b48f3404630188.jpg

以上两个例子中只要是二者符合其中一条都会进入if语句,那么视频中老师讲的!lastEventTimestamp如果不成立了(不起作用了),但是后面的条件依然符合(起作用),那么依然还会进入if语句中。

同学看看是否能理解以上解释的内容,另建议同学再去视频中从13分51秒听一下,视频中老师梳理的代码流程。

祝学习愉快!

  • qq_慕丝0136605 提问者 #1

    https://img1.sycdn.imooc.com//climg/62060e5c09994d7504850087.jpg

    老师 是节流函数只执行一次,之后的scroll事件执行的都是其返回的那个函数?

    2022-02-11 15:23:26
  • 好帮手慕小李 回复 提问者 qq_慕丝0136605 #2

    同学你好,解答如下:

    1、同学所说的这种情况是,不停的使用scroll才会一直在节流函数中。

    2、一般情况下这一块的逻辑是,当使用了scroll之后,调用节流函数,当节流函数执行完毕后就才可以再次使用scroll动作。那么再次执行scroll之后,还会按照上面的逻辑继续走一遍。(比如说不停地使用scroll则会是第一种情况,因为它一直不停,所以就不会在重新触发scroll)

    同学尝试理解一下,祝学习愉快!

    2022-02-11 16:13:26
  • qq_慕丝0136605 提问者 回复 好帮手慕小李 #3

    老师,我的代码在第二种情况下好像有点问题,麻烦老师帮我看一看

    <!DOCTYPE html>

    <html lang='en'>


    <head>

        <meta charset='UTF-8'>

        <meta name='viewport'

            content='width=device-width, initial-scale=1.0,user-scalable=no,maximum-scale=1.0,minimum-scale=1.0'>

        <title>Document</title>

        <style>

            html {

                height: 2000px;

            }


            .none {

                display: none;

            }


            div {

                width: 100px;

                height: 100px;

                background-color: red;

            }

        </style>

        <script src='https://unpkg.com/vue@next'></script>

    </head>


    <body>


        <div></div>

        <div></div>

        <div></div>

        <div></div>

        <div></div>

        <div></div>

        <div></div>

        <div></div>

        <div></div>

        <button id="backTop" class="none">回到顶部</button>

        <script>

            const $bakcTop = document.getElementById('backTop');


            //当window大小变化时重新获取;

            let WH = window.innerHeight;

            window.addEventListener('resize', () => {

                WH = window.innerHeight;

                //console.log(`innerHeight${window.innerHeight}`);

            }, false);


            window.addEventListener('scroll',

                //节流

                throttle(handler), false);


            function handler() {

                //console.log(document.documentElement.scrollTop);

                if (document.documentElement.scrollTop >= WH) {

                    $bakcTop.classList.remove('none');

                } else {

                    $bakcTop.classList.add('none');

                }

                console.log('scroll');

            }

            //节流函数:事件处理函数执行一次后,在某个时间期限内不再工作;

            function throttle(fn, miliseconds = 250, context) {

                //上一次事件触发的时间戳

                console.log(1);

                let lastEventTimestamp = null;

                return function (...args) {

                    const self = context || this;

                    const now = Date.now();

                    // console.log(args);

                    if (!lastEventTimestamp || now - lastEventTimestamp >= miliseconds) {

                        lastEventTimestamp = now;


                        //在某个期限过后,才能执行下次的处理函数

                        fn.apply(self, args);

                    }

                };

            }

        </script>

    </body>


    </html>


    2022-02-11 19:26:15
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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