百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 行业知识 > 正文

(鸡汤文)这一次我终于搞懂了 JavaScript 定时器的 this 指向

citgpt 2024-11-25 10:04 4 浏览 0 评论

开篇语

忽然有一种感觉,每次学习一个知识点就像是谈一场恋爱:从初次邂逅,到彼此了解,一切都那么的符合恋爱的过程!

如果这个知识点再有点”调皮“的话,那简直是让人欲仙欲死而又不可自拔!因为你永远不知道它还有多少面纱等着你揭开,当你自以为对它已经足够了解的时候,冷不防就是一个盲点迎面砸来。

(鸡汤文)这一次我终于搞懂了 JavaScript 定时器的 this 指向

它简直就像一个”宝藏女孩“,你要时刻做好迎接”惊喜“的准备!

可能正是因为这种新鲜感,我才能一直保持一种类似亢奋的状态吧。当然,这只是针对知识而言,对待情感我还是很保守很专一的<( ̄︶ ̄)>

这两天,我就在和定时器谈恋爱,哦不,是在学习定时器( ̄▽ ̄)~*,可没想到,又给陷进去了……

这不,上一篇文章写完定时器的返回值后,刚觉得自己对它已经了解的清清楚楚明明白白了,够我炫耀一阵子了,谁成想,喘口气的功夫,它又给我整出了幺蛾子。

惑起

写完上篇文章后,我就琢磨着里面的实现代码还可以优化一下,于是给改成了下面这个样子:

<form action="" class="example-form">
    <div>
        <label for="name">
            名称
        </label>
        <input class="input-ele" type="text" name="name" id="name" placeholder="please input your name"
            autocomplete="off">
    </div>
    <div style="margin-top:50px;">
        <label for="res">
            输入
        </label>
        <textarea class="input-ele" type="multipart" name="res" id="res" readonly
            placeholder="这里是每一次输入的结果"></textarea>
    </div>
</form>

<script>
    window.onload = function () {
        const resEle = document.querySelector("#res");
        function changeOutputVal() {
            resEle.value += `\n${ this.value }`;
        }
        function throttle(fun, delay) {
            let last, deferTimer
            return function () {
                let now = Date.now();
                if (last && now < last + delay) {
                    clearTimeout(deferTimer);
                    deferTimer = setTimeout(function () {
                        last = now;
                        fun.apply(this);
                    }, delay)
                } else {
                    last = now;
                    fun.apply(this);
                }
            }
        }
        const inputEle = document.querySelector("#name");
        inputEle.addEventListener("input", throttle(changeOutputVal, 1000));
    }
</script>

我的修改依据是:

  1. throttle 方法返回的是一个匿名函数,这个函数正好充当 input 事件的回调函数
  2. input 事件回调函数中的 this 指向的是 inputEle
  3. 匿名函数中将 this 绑定给了 fun 参数,而实际使用中传入的是 changeOutputVal 方法
  4. 所以 changeOutputVal 方法中的 this 指的就是 inputEle,所以在它里面可以通过 this.value 获取到 inputEle 的值

看,这逻辑多严谨,简直头头是道啊 \( ̄︶ ̄)/

按理说,是没问题的吧,结果却出问题了。欲知详情,请看大屏幕:


这个 undefined 是什么鬼?!从哪冒出来的?难道我的延时器没用对?

解惑

面对我的质疑,setTimeout 理直气壮地说:人家回调函数中的 this 本来就是指向 window 对象的嘛,你也没早问啊!

那么,问题来了:为什么延时器中的 this 指向的是 window 呢?setTimeout 自己也解释不清楚了。

得,看来前人诚不我欺也——自己动手,丰衣足食!

凡事不决找 MDN,绝对靠谱!我们来看看 MDN 怎么说:

setTimeout()调用的代码运行在与所在函数完全分离的执行环境上。这会导致,这些代码中包含的 this 关键字在非严格模式会指向 window (或全局)对象,严格模式下为 undefined,这和所期望的this的值是不一样的。

看到这个解释,我才明白:this 指向 window 对象,原来是因为执行环境的不同导致的。

在上面的代码中,因为 window 对象没有 value 这个属性,所以 window.value = undefined

感觉自己在专业的方向上又迈进了一小步,容我小小地嘚瑟一下!

改错

既然知道问题出在哪,那就好办了,我们只需要将 setTimeout 回到函数内部的 this 指向改变一下就好,这里有以下方案。

使用变量引用外部 this

关键代码如下:

window.onload = function () {
    // some code here
    
    const that = this;
    deferTimer = setTimeout(function () {
        last = now;
        fun.apply(that);
    }, delay)
    
    // some code here
}

使用箭头函数

利用箭头函数不会改变 this 的指向的特性,改造如下:

window.onload = function () {
    // some code here
    
    deferTimer = setTimeout(() => {
        last = now;
        fun.apply(this);
    }, delay)
    
    // some code here
}

结束语

知错能改,善莫大焉!

写到这里,我居然体会到了古人那种”朝闻道,夕死可矣“的满足感。

在编程这条路上,可能遍布荆棘,但只要我们勤耕不辍,总能开辟出属于自己的康庄大道!

这鸡汤太美味,我先干为敬,你们随意!b( ̄▽ ̄)d

~

~

~ 本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

相关推荐

Win7打开网页特别慢的原因?

经常打开Web的频繁用户的数量应该打开,因此,一旦网页的速度很慢,它会变得非常敏感。最近,Win7系统的用户发现他们打开了他们的网页,突然放慢了,绝不看网络速度和配置因素,最有可能是系统内存问题。如果...

电脑浏览器下载速度很慢怎么办

有网友反映自己的浏览器下载速度很慢怎么办?这种通过可能是浏览器缓存太多,没有优化等原因导致。下面小编就以几种常用的浏览器为例,给大家解答下...

网站打开慢的问题如何解决?

  当我们在浏览网页时,突然发现一个网站打不开或者加载速度非常慢,这时候你会不会感到很烦躁呢?别担心,今天我们就来教你解决网站打开慢的问题!  一、检查网络连接  我们需要确保自己的网络连接正常。请尝...

打开网页速度慢、下载速度慢、玩游戏延迟、频繁掉线的解决方法

影响实际上网速度的因素非常多,需要挨个做排查1、先排除是否是网络环境问题,可以核实以下情况,来判断是否是网络环境问题。(1)同一网络环境,如果其他电脑上网也很慢,则可判断是网络本身速度不快导致的。(2...

浏览器太卡、启动慢,教你一招提速至少一倍!

电脑端浏览器用久了都会有一个毛病那就是开启速度非常缓慢今天教大家一个小技巧可大大提升浏览器启动速度适用于QQ、360、搜狗等大多数浏览器提速效果非常明显启动速度至少要快一倍SpeedyFox支持平台:...

网站访问慢的排查方案(最详细)

说实话,比起网站打不开,网站访问慢更让人抓狂。因为造成网站访问慢的因素太多了,一般用户根本无从下手!任他千头万绪的问题,从以下三个方面入手,也能轻松破解访问慢的大难题:响应时间、执行时间、加载时间。...

电脑网页打开慢怎么办?金山毒霸电脑医生秒搞定

??在网络时代,上网是每天都会做的事,平时用手机上网比较多,但是工作的时候还是用电脑上网的,不管手机还是电脑都会越用越慢。有时会觉得,电脑配置也不低,每天都清理垃圾了都,网速也还行电脑怎么还上网这么慢...

家里wifi慢是怎么回事?教你几招提速方法

没WiFi,不成活!手机和WiFi之间,就像空调加棉被,谁也离不开谁。如今WiFi已经填满了我们生活的每个角落,很难想象,如果哪天没了网,世界会变成什么样!可是家里的WiFi是越用越慢,不知道有多少人...

连接路由器宽带测速正常,打开网页很慢?

电脑连接路由器后测试网速和申请的宽带一致,但打开网页的速度较慢,请参考以下步骤排查:1、更改DNS服务器电脑上获取的DNS服务器不稳定可能会导致打开网页较慢,可以在电脑的本地连接或无线连接手动设置DN...

手机打开网页非常慢,那是你用的浏览器不对!

今天世超独宠Android差友不知道大家平日里,在刷着微博浏览着新闻的时候有没有遇见过这样的情况:在你浏览的过程中,总会出现一些让你感兴趣的链接。这些链接可能是:”这个视频,女人不在家男人偷偷看!”“...

网站打开慢的原因有哪些?

网络能够为大家带来许多便利,现在的人们不管是在学习或者是工作当中都是离不开网络的。在网络中,各大网页和网站也是我们浏览信息的主要渠道。如果想要更加高效率的工作和学习的话,当然也离不开网站浏览速度的支持...

告诉你导致网站页面打开速度慢的几种情况

导致网站页面打开速度慢的原因有很多,主要注意以下几个方面,就能做到很好的避免。...

浏览器变慢有救了!只要2秒,重回新安装一样爽快!

而最近有小伙伴在后台留言,说自己电脑浏览器用久了后,速度变得越来越慢了。特别是用久后,每次打开浏览器加载半天,经常白屏卡上那么一小会,体验上要比看这loging在转还难受,差点以为死机了。其...

导致网站打开慢的原因以及解决方法

是什么原因会导致网站打开慢?又有什么办法解决呢?一般来说,http请求过多、网页过大、服务器性能过差等等都可能导致网站打开慢。www.xy3000.com小蚁云安全乔妹为您分享一些参考解决方法:研究表...

还在为打开网页慢而苦恼吗?试试这招

不知道大家有没有这种感觉,家里网速明明很快,有20M,50M甚至100M,但不知道为什么打开网页,浏览页面的时候总感觉加载速度很慢。其实上网速度的快慢不仅仅取决于你家的宽带速度,也跟你的电脑硬件,系...

取消回复欢迎 发表评论: