问题

为什么有的高级程序员很讨厌甚至禁止使用 setTimeout?

回答
有一些资深的开发者,他们的编程生涯早已积累了对代码健壮性、可维护性和可预测性的深刻理解。在他们看来,`setTimeout` 就像一个隐藏的“定时炸弹”,一旦使用不当,很容易在项目的复杂性和时间推移中,酿成难以捉摸的bug。

首先,考虑的是可测试性。一个良好的软件系统,其核心在于能够被可靠地测试。`setTimeout` 引入了异步执行和时间延迟,这使得编写单元测试变得尤为困难。你无法直接断言某个函数会在执行后立即产生某个结果,因为 `setTimeout` 的回调函数会在未来的某个不确定时间点被触发。你不得不依赖于诸如 `jest.useFakeTimers()` 这样的工具来模拟时间的流逝,这无疑增加了测试的复杂性和潜在的失败点。对于一个追求自动化和可靠性的高级开发者来说,这种测试上的阻碍是他们不愿意轻易接受的。

其次,是副作用的堆积和管理。`setTimeout` 本质上是在当前执行栈之外开辟了一个新的执行环境,并在指定延迟后将回调函数推入事件队列。如果一个函数内部调用了 `setTimeout`,并且这个回调函数又包含了修改全局状态、DOM 元素或者发起网络请求等副作用,那么随着项目规模的增长,这些异步副作用的执行顺序、触发时机以及它们之间可能产生的相互影响,就会变得越来越难以追踪和控制。就像在一个繁忙的厨房里,每个人都可能随时“预定”某个操作,而你很难确切知道这些预定操作什么时候会同时发生,是否会因为某个“预定”的提前或延后而打乱整个流程。这种“隐藏的”操作,让开发者在调试时就像在迷宫里寻找线索,每一个异步回调都可能是一个岔路口,稍有不慎就可能走进死胡同。

再者,是依赖性问题和状态的管理。`setTimeout` 常常被用于在某个操作完成后,等待一段时间再执行另一个操作,或者是为了实现某种轮询。然而,这种基于时间的依赖性非常脆弱。一旦基础操作的执行时间发生了微小的变化,或者由于系统负载等原因导致回调执行的延迟,就可能破坏原有的逻辑。更糟糕的是,当这个 `setTimeout` 回调需要访问执行它时的某些变量或状态时,如果这些状态在回调被调度之后、但执行之前被修改了,那么 `setTimeout` 回调将操作到的是一个过时的状态,这带来的错误是极其隐蔽和难以发现的。高级开发者更倾向于使用 Promise、async/await 或者 RxJS 等更明确、更易于管理状态流的机制来处理异步操作,因为它们提供了更清晰的依赖关系和生命周期管理。

此外,性能和资源占用也是一个考量。尽管单个 `setTimeout` 的资源占用微乎其微,但如果在高并发场景下,或者在一个非常频繁地创建和销毁 `setTimeout` 的循环中,就可能对浏览器或 Node.js 的事件循环造成不必要的压力。大量待执行的定时器,即使还没有到时间,也会在内存中占据一席之地,并需要事件循环去管理它们的计时。相比之下,一些更底层的异步处理机制,如 Web Worker 或更精细的事件监听,在某些情况下可能提供了更优化的资源使用方式。

最后,也是一个非常重要的原因,那就是代码的可读性和意图的清晰度。`setTimeout` 的语法本身,尤其是在嵌套使用时,会迅速降低代码的可读性。开发者需要花费额外的精力去理解“这个函数会在多久之后执行,它会做什么,以及它依赖于什么”。而像 Promise.then() 或者 async/await 这样的结构,能够更直观地表达“在某个异步操作完成后,再执行这个操作”,这种“链式”或者“顺序”的表达方式,更符合人类的逻辑思维,也更容易被其他开发者理解和维护。

总而言之,对于一些追求代码的“纯粹性”、“可预测性”和“可维护性”的高级开发者来说,`setTimeout` 这种引入了时间依赖和隐式调度的工具,往往会成为他们谨慎避免或彻底禁止的对象,转而寻求更健壮、更透明的异步解决方案。他们不是在反对异步,而是反对一种不够“健壮”的异步处理方式。

网友意见

user avatar

抱歉我真想不出来JS里面的setTimeout有替代品,这货几乎是无可替代的(setInterval本质上是一个东西),不允许用有些东西就是做不了。


setTimout本质上就是一个注册一个延时触发的事件。并不是所有的状态改变都可以注册事件,有些场景不直接/间接使用setTimeout/setInterval就做不了。



当然,直接使用这种低阶API的确是不值得倡导的,就像滥用Thread.Sleep一样……

类似的话题

  • 回答
    有一些资深的开发者,他们的编程生涯早已积累了对代码健壮性、可维护性和可预测性的深刻理解。在他们看来,`setTimeout` 就像一个隐藏的“定时炸弹”,一旦使用不当,很容易在项目的复杂性和时间推移中,酿成难以捉摸的bug。首先,考虑的是可测试性。一个良好的软件系统,其核心在于能够被可靠地测试。`s.............
  • 回答
    这个问题很有意思,也触及到了一个挺普遍的观察。我们确实能看到识字率大涨,高等教育普及率也在不断提升,但有时候看网友的评论和讨论,确实会让人觉得思考的深度和广度好像并没有同步增长,甚至有时候还显得有些……怎么说呢,浅薄或者情绪化。这背后其实有很多层次的原因,咱们掰开了揉碎了聊聊。首先,得承认教育的巨大.............
  • 回答
    这个问题确实挺让人疑惑的,明明大家读书都读得比过去多了,但有时看网上的讨论,真是让人直摇头,感觉不少人好像没什么长进,甚至有些话离谱到让人怀疑他们是不是没上过学。这背后其实挺复杂的,不是简单一两句话就能解释清楚的。首先得承认,咱们现在这教育普及率那可真是杠杠的。识字率肯定比过去高太多了,这毋庸置疑。.............
  • 回答
    听到你弟弟考高中不理想,想让他去学程序、当程序员,这个想法很棒!现在IT行业发展这么快,学门技术,尤其是编程,未来的路确实很宽。作为哥哥/姐姐,你想为他找个好学校,这份心意很让人感动。我给你推荐几个方向,你可以结合你弟弟的实际情况和喜好,再好好斟酌一下。首先,得明确一下你弟弟的情况和期望。在推荐学校.............
  • 回答
    互联网行业程序员和产品经理的薪资差异是一个复杂的问题,涉及多种因素的相互作用。通常情况下,经验丰富的、技术能力突出的高级程序员的薪资会高于同等经验的产品经理,但这种情况并非绝对。为了更详细地解释这个问题,我们可以从以下几个关键维度进行分析:一、技能的稀缺性与技术门槛: 程序员: 技术.............
  • 回答
    这个问题挺有意思的,也确实是很多人好奇的点。要说程序员的工资为什么普遍比很多其他行业高,我觉得得从几个层面上细掰扯掰,不能简单归结于“他们聪明”或者“就是市场需求大”。这里面有很多互相作用的因素。1. 技能的稀缺性与门槛:首先,得承认,写代码这门手艺,门槛确实不低。它不是说你天生就得是个数学家,但它.............
  • 回答
    你这个问题问得特别好,触及到了很多正在编程或者将要编程的人的好奇心。确实,很多时候我们看到那些经验丰富的“老家伙们”,敲代码的速度、解决问题的能力,甚至是代码质量,都让我们这些年轻的后来者望尘莫及。这背后绝对不是什么神秘魔法,而是很多实实在在的积累和思考。我尝试着从几个维度给你剖析一下,希望能让你觉.............
  • 回答
    这个问题挺有意思的,也是很多圈子里大家津津乐道的一个话题。为什么一边是程序员普遍带着点“不屑”的态度,另一边却是360在用户数和市场份额上一直不算小?我试着从几个角度给你掰扯掰扯。程序员为什么“鄙视”360?这里说的“鄙视”可能有点重,更多的是一种“看不上”、“不认可”、“觉得不够专业”的情绪。这背.............
  • 回答
    “中国程序员工资那么高,连一个MATLAB的替代品都开发不出来”这个问题,触及了技术发展、产业生态、人才培养以及市场需求等多个层面,背后原因复杂且值得深入探讨。简单地将高薪与开发不出替代品画等号,是一种过于简化的视角。要理解这个问题,我们需要从以下几个方面进行分析:一、 中国程序员工资高是事实,但其.............
  • 回答
    明朝的专制程度之高,相信大家都深有体会。皇帝拥有绝对的权力,朝政的运行很大程度上取决于皇帝的个人意志。然而,令人有些费解的是,在这样一个高度集权的体制下,明朝的言官群体,却展现出了前所未有的“战斗力”和“表现欲”,这似乎与我们通常的认知——专制程度越高,敢于直言的人越少——形成了鲜明的对比。这其中的.............
  • 回答
    这是一个非常有意思的问题,也是很多观察者在疫情期间反复思考的。发达国家居民普遍拥有较高的受教育程度,这通常意味着他们具备更好的获取、理解和运用信息的能力,按理说在面对像新冠肺炎这样的公共卫生危机时,应该能更好地做出理性的判断和行为。然而,我们看到的现实情况却更为复杂,甚至在某些方面显得有些“反常”。.............
  • 回答
    这是一个很有意思的问题,也触及了我们社会对不同职业的认知和价值判断。其实,大家对机长和船长报以更多尊重的心理,背后是多重因素交织的结果,并非简单的职位高低或收入差异就能完全解释。首先,我们来看看机长和船长这两个职业的核心责任和所承担的风险。 机长: 驾驶飞机,掌控着数百人的生命安全,以及价值不菲.............
  • 回答
    这个问题很有意思,它触及了历史的复杂性,也澄清了一些普遍的误解。首先,我们得端正一个认识:“南方开放程度更高”这个说法,在解放战争时期,并不完全准确,或者说,这个“开放”的含义需要更细致地理解。 如果我们说的是商业、对外贸易的活跃程度,或许南方的一些城市,比如上海,确实有其优势。但解放战争的胜利,其.............
  • 回答
    亲爱的你,看到你这么难过,我心里也特别不好受。请你先深呼吸几次,我知道现在你可能觉得天都要塌下来了,但请相信我,你一点也不“胖到不可思议”。155的身高,100斤的体重,这在很多人眼里,甚至是大多数人眼里,是一个非常匀称、健康的体重范围。真的,我没在安慰你,我说的是事实。我们先从一些客观的数据来看看.............
  • 回答
    国内各大高校之所以普遍选用谭浩强的《C 程序设计》作为教材,并非是某个单一因素决定的,而是多方面因素综合作用的结果。我们可以从以下几个方面进行详细的阐述:一、历史悠久与市场占有率的先发优势: 最早的中文C语言教材之一: 谭浩强的《C程序设计》早在改革开放初期就出版了,当时国内计算机教育刚刚起步,.............
  • 回答
    关于辽朝在后世认同和认可度上,似乎比鲜卑的三魏、金以及蒙古的元朝显得更高一些,这确实是一个值得探讨的现象。要理解其中的原因,我们需要深入剖析历史的进程、各民族的文化融合程度,以及后世评价体系的形成。首先,我们得承认,历史的评价是复杂的,而且往往带有后世的视角。辽朝,作为契丹人建立的王朝,在中国历史上.............
  • 回答
    一件衣服穿在身上,那种“高级感”还是“廉价感”,其实并不是一蹴而就的,而是由很多微妙的细节共同作用的结果。很多人买衣服,凭的是一种感觉,但这种感觉背后,藏着不少门道。首先,最直观也最容易被忽略的,就是面料。这是决定一件衣服骨架和质感的最根本的东西。 天然纤维的魅力:想想看,羊绒衫的柔软贴服,丝绸.............
  • 回答
    这是一个非常引人入胜的问题,它触及了我们对宇宙、存在以及自身认知局限性的根本思考。要回答“是否有比佛更高级的存在”,我们需要先厘清几个核心概念,然后才能进行深入的探讨。首先,“佛”这个概念本身就具有多重含义。在佛教语境中,“佛”指的是觉悟者,是彻底摆脱了烦恼、痛苦和轮回束缚的至高存在。他们拥有无量的.............
  • 回答
    关于“为什么很多空姐开豪车、穿戴奢侈品,出入高级餐厅,但又选择继续当空姐”的疑问,这其中确实存在一些值得探讨的现象。需要澄清的是,并非所有空姐都如此,但确实有一部分会展现出这样的生活方式,这背后可能有多种原因交织在一起。首先,我们得认识到空乘这份职业本身的特点。它提供了一个相对独特的平台,让从业者能.............
  • 回答
    这确实是一个令人着迷的宇宙级谜题:地球,这颗在浩瀚星海中孕育了整整45亿年的行星,为何似乎只孕育出了我们——人类,一种拥有高级智慧的生命?要深入探讨这个问题,我们得从地球这颗行星的诞生之初,一步步剥开它漫长而复杂的地质与生命演化史。这并非一个简单的“为什么”,而是一系列相互关联、环环相扣的概率事件和.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有