首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果不使用setTimeout(),UI会被阻塞,加载时间会更长

如果不使用setTimeout(),UI会被阻塞,加载时间会更长。

setTimeout()是JavaScript中的一个函数,用于在指定的时间后执行一段代码。它可以用来创建一个定时器,延迟执行某个操作,从而避免阻塞UI。

当浏览器执行JavaScript代码时,它是单线程的,意味着一次只能执行一段代码。如果某段代码需要执行很长时间,比如进行复杂的计算或者请求大量数据,那么这段时间内,浏览器无法响应其他用户操作,UI会被阻塞。

使用setTimeout()可以将这段耗时的代码延迟执行,让浏览器有机会响应其他用户操作,保持UI的流畅性。通过设置一个适当的延迟时间,可以让用户感知到更快的加载速度。

然而,如果滥用setTimeout(),设置过长的延迟时间,也会导致加载时间变长。因为延迟时间过长,页面需要等待更久才能执行后续操作。

为了优化加载时间和用户体验,可以采取以下措施:

  1. 使用异步操作:将耗时的操作放在异步函数中执行,避免阻塞UI。
  2. 使用Web Worker:Web Worker是一种在后台运行的JavaScript脚本,可以执行耗时的计算任务,而不会阻塞UI线程。
  3. 分块加载:将页面内容分成多个块,按需加载,减少首次加载时间。
  4. 压缩和合并资源:对JavaScript、CSS、图片等资源进行压缩和合并,减少网络请求次数和资源大小。
  5. 使用缓存:合理设置缓存策略,减少重复请求,提高加载速度。

腾讯云相关产品和产品介绍链接地址:

  • 异步操作:https://cloud.tencent.com/document/product/213/10578
  • Web Worker:https://cloud.tencent.com/document/product/213/10579
  • 分块加载:https://cloud.tencent.com/document/product/213/10580
  • 压缩和合并资源:https://cloud.tencent.com/document/product/213/10581
  • 缓存:https://cloud.tencent.com/document/product/213/10582
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Web Worker 的内部构造以及 5 种你应当使用它的场景

在一些因大量计算引起的 UI 阻塞问题中,使用 setTimeout 来解决阻塞的效果还不错。...例如,我们可以把一系列的复杂计算分批放到单独的 setTimeout 中执行,这样做等于是把连续的计算分散到了 event loop 中的不同位置,以此为 UI 的渲染和事件响应让出了时间。...以上所有的计算逻辑都可以交给 Web Worker 完成,从而阻塞 UI 线程的执行。或者更好的方案是使用多个 Worker (以及多个 CPU)来完成图片渲染。...为保证存取时阻塞 UI 线程,这部分工作理应交给 Web Worker 完成。好吧,在 IndexDB 中你可以不使用 Web Worker,因为它提供的异步 API 同样不会阻塞 UI。...如果在搜索树中没有匹配到待测词语,程序替换字符组成新的词语,并测试新的词语是否是用户期待输入的,如果是则会返回该词语。

3.6K10

浏览器层面优化前端性能(1):Chrom组件与进程线程模型分析

因此如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。...GPU中,各个复合图层是单独绘制的,所以互不影响,这也是为什么某些场景硬件加速效果一级棒如果a是一个复合图层,而且b在a上面,那么b也会被隐式转为一个复合图层,这点需要特别注意css加载是否阻塞dom...)因为加载css的时候,可能修改下面DOM节点的样式,如果css加载阻塞render树渲染的话,那么当css加载完之后,render树可能又得重新重绘或者回流了,这就造成了一些没有必要的损耗。...,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。...要尽量避免JS执行时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

87710
  • 浏览器层面优化前端性能(1):Chrom组件与进程线程模型分析

    因此如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。...GPU中,各个复合图层是单独绘制的,所以互不影响,这也是为什么某些场景硬件加速效果一级棒如果a是一个复合图层,而且b在a上面,那么b也会被隐式转为一个复合图层,这点需要特别注意css加载是否阻塞dom...)因为加载css的时候,可能修改下面DOM节点的样式,如果css加载阻塞render树渲染的话,那么当css加载完之后,render树可能又得重新重绘或者回流了,这就造成了一些没有必要的损耗。...,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。...要尽量避免JS执行时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

    77310

    Facebook 将对 React 的优化实现到了浏览器!

    想要提高一个网页的加载速度是非常困难的,如果你的网站是在使用 JavaScript 渲染的内容,你必须要在网页的加载速度和网页的输入响应能力之间作出权衡: 一次性执行首屏需要执行的逻辑(负载性能好,...这种设计为开发者提供了一个健壮的执行模型,但是如果脚本执行的时间太长,则用户体验(尤其是响应能力)可能遭受严重损失。...每次页面将控制权交还给浏览器时,浏览器都会花费一些时间来检查它的事件队列,处理完事件后再获取下一个 JavaScript 代码逻辑。当浏览器更快地响应事件时,页面的整体加载时间变慢。...而且,用户输交互比较多的情况下,页面加载非常慢。如果我们不那么频繁地进行上面的过程,那么浏览器响应用户事件所花费的时间就会更长。...使用调度程序模式,让我们勾勒出如何在假设的processWorkQueue()函数中处理我们的工作: 假设你在首屏加载页面时要处理非常多的阻塞逻辑,例如从组件生成标记,分解质数,或者只是绘制一个很酷的加载器动画

    62510

    揭秘: 一个 JavaScript 库如何带动 Chromium 的发展?

    想要提高一个网页的加载速度是非常困难的,如果你的网站是在使用 JavaScript 渲染的内容,你必须要在网页的加载速度和网页的输入响应能力之间作出权衡: 一次性执行首屏需要执行的逻辑(负载性能好,输入响应能力差...这种设计为开发者提供了一个健壮的执行模型,但是如果脚本执行的时间太长,则用户体验(尤其是响应能力)可能遭受严重损失。...每次页面将控制权交还给浏览器时,浏览器都会花费一些时间来检查它的事件队列,处理完事件后再获取下一个 JavaScript 代码逻辑。当浏览器更快地响应事件时,页面的整体加载时间变慢。...而且,用户输交互比较多的情况下,页面加载非常慢。如果我们不那么频繁地进行上面的过程,那么浏览器响应用户事件所花费的时间就会更长。 ?...使用调度程序模式,让我们勾勒出如何在假设的processWorkQueue()函数中处理我们的工作: 假设你再首屏加载页面时要处理非常多的阻塞逻辑,例如从组件生成标记,分解质数,或者只是绘制一个很酷的加载器动画

    78820

    2023我的前端面试小结3

    JS 在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到 Task(有多种 task) 队列中。...setTimeout 和 setInterval一个 timer 指定的时间并不是准确时间,而是在达到这个时间后尽快执行回调,可能因为系统正在执行别的事务而延迟。...下限的时间有一个范围:[1, 2147483647] ,如果设定的时间不在这个范围,将被设置为1。...1;同步和异步的区别同步指的是当一个进程在执行某个请求时,如果这个请求需要等待一段时间才能返回,那么这个进程一直等待下去,直到消息返回为止再继续向下执行。...异步指的是当一个进程在执行某个请求时,如果这个请求需要等待一段时间才能返回,这个时候进程继续往下执行,不会阻塞等待消息的返回,当消息返回时系统再通知进程进行处理。

    51640

    我不知道的 Event Loop

    我们都知道Js是单线程语言,即同一时间只能做一件事情,但是为了协调各种事件、用户交互、脚本加载UI渲染和网络处理等行为,避免主线阻塞,出现了EventLoop => ==事件循环==也就是我们常说的...同步阻塞代码运行,例如 alert 异步:异步任务会在异步任务有了结果后,将注册的回调函数放入任务队列中等待主线程空闲的时候(调用栈被清空),被读取到栈内等待主线程的执行。。...所以像setTimeOut定时任务、ajax请求都是需要一定的时间的,所以一般都是用异步方式,不会阻塞后边代码的执行,而是设置了定时时间之后、或发送了请求之后,就移动到单线程的任务队列的最尾端,等后边执行完之后再执行定时代码或者...) script全部代码、 setTimeout、 setInterval、 setImmediate(浏览器暂时不支持,只有IE10支持,具体可见MDN)、 I/O、 UI Rendering。...长时间接触,有些记忆越发的淡忘。只能不断重拾记忆,加深。

    51010

    JavaScript·从浏览器解析 JS 运行机制

    从上述的互斥关系,可以推导出,JS 如果执行时间过长就会阻塞页面。譬如,假设 JS 引擎正在进行巨量的计算,此时就算 GUI 有更新,也会被保存到队列中,等待 JS 引擎空闲后执行。...然后,由于巨量计算,所以 JS 引擎很可能很久很久后才能空闲,自然感觉到巨卡无比。所以,要尽量避免 JS 执行时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。...这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。...css 加载是否阻塞 dom 树渲染? 在解答这个问题之前需要知道一个重要概念:css 是由单独的下载线程异步下载的。...这是浏览器的一种优化机制,因为加载 css 的时候,可能修改下面 DOM 节点的样式, 如果 css 加载阻塞 render 树渲染的话,那么当 css 加载完之后,render 树可能又得重新重绘或者回流了

    88520

    JavaScript 视觉化:Event-Loop

    啊,在那个任务期间,我们需要等待 30s 才能执行其他任务(默认情况下,JavaScript 执行在浏览器的主线程上,所以整个 UI 会被卡住 )。...这些包括 DOM 接口、setTimeout、HTTP 请求等等。这些特性可以帮助我们创建一些异步、非阻塞行为 。 当我们调用一个方法时,它会被加入到一个叫做调用栈的里面。...(gif 太大,看动图点击原文) respond 函数返回一个 setTimeout 函数,setTimeout 是 Web 接口提供给我们的:它使我们能在阻塞主线程的情况下延迟一些任务。...我们传递给 setTimeout 的箭头函数 ()=>{return 'Hey'} 被加载到浏览器提供的 Web 接口中。...现在我们都在等待 Event loop 执行它的任务所需时间:连接队列与调用栈!若调用栈空了,意味着之前所有调用的函数已经返回它们各自的值而且从栈中被抛出,同时队列中的第一项会被加到调用栈中。

    47330

    js Event Loop 运行机制

    这些概念对初识前端的同学来说可能一头雾水。而且运行js代码的运行环境除了浏览器还有node。因此不同环境处理Event Loop又变得不同,十分容易混淆。如果你有这样的疑问。...当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行 注意:UI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被冻结了),UI更新会被保存在一个队列中等到...执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。...node js 是单线程的 和浏览器环境下类似,他有一个解析js的主线程,其他线程作为辅助,但是因为涉及操作dom,ui线程就不存在了。...缺点: 不适合大量的计算和压缩等cpu密集型的操作,造成阻塞。 node下Event Loop 事件环的整体还是不变的,执行栈,消息队列,api。不同的是,node下的消息队列有所不同 ?

    1.7K40

    JavaScript定时器:setTimeout与setInterval 定时器与异步循环数组

    与setInterval唯一不同的是,setTimeout在指定的延迟时间到达后 向ui队列添加一个任务,函数立即执行,setInterval则是在指定的延迟时间不断的向ui队列添加执行任务,如果你没有手动清除那么...setInterval就会一直执行下去,直到页面被关闭,如果ui队列中存在由同一个setInterval创建的任务,那么后续任务将不会被添加到ui队列中。...UI线程的工作基于一个简单的队列系统,任务会被保存到队列 中直到进程空闲时被提取出来执行。所以Javascript的执行会阻塞UI更新;反之,UI更新也阻塞Javascript的执行。...而UI线程的阻塞很多时候是由于我们要在代码里进行长时间的脚本运算,超过了浏览器限 制,导致浏览器失去响应,冻结用户界面。...,ui启动更新,因此并不会导致页面空白,用户体验提高; setTimeout(function(){ for(var i=0;i<2500;i++){ document.body.innerHTML

    2.2K60

    每天10个前端小知识 【Day 12】

    会被执行。如果不需要执行,需要在 resolve 语句前加上 return。 2. 什么是内存泄漏?什么原因导致呢? 内存泄露的解释:程序中己动态分配的堆内存由于某种原因未释放或无法释放。...,执行的时间间隔是不能精确控制的,对一些高实时性的需求就不太符合 常见的宏任务有: script (可以理解为外层同步代码) setTimeout/setInterval UI rendering/UI...一般有以下几种方式: defer 属性: 给 js 脚本添加 defer 属性,这个属性让脚本的加载与文档的解析同步解析,然后在文档解析完成后再执行这个脚本文件,这样的话就能使页面的渲染不被阻塞。...async 属性: 给 js 脚本添加 async 属性,这个属性会使脚本异步加载,不会阻塞页面的解析过程,但是当脚本加载完成后立即执行 js 脚本,这个时候如果文档没有解析完成的话同样阻塞。...使用 setTimeout 延迟方法: 设置一个定时器来延迟加载js脚本文件。 让 JS 最后加载: 将 js 脚本放在文档的底部,来使 js 脚本尽可能的在最后来加载执行。

    13410

    JavaScript 事件循环

    JavaScript引擎大多数时候执行任何操作,它仅在脚本/处理程序/事件激活时执行。 任务示例: 当外部脚本 加载完成时,任务就是执行它。...(推荐使用) 那么,两者有什么具体的区别呢?...为了演示这种方法,简单起见,让我们写一个从 1 数到 1000000000 的函数,而写文本高亮。 如果你运行下面这段代码,你会看到引擎“挂起”一段时间。...现在,如果在引擎忙于执行第一部分时出现了一个新的副任务(例如 onclick 事件),则该任务会被排入队列,然后在第一部分执行结束时,并在下一部分开始执行前,执行该副任务。...如果我们使用 setTimeout 将繁重的任务拆分成几部分,那么变化就会被在它们之间绘制出来。

    85420

    JavaScript是如何工作的:Web Workers的构建块+ 5个使用他们的场景

    不是一个HTTP请求而是一个阻塞代码(比如一个内容很多的for loop循环),就没有办法及时清空事件循环,浏览器的 UI 渲染就会被阻塞,页面无法及时响应给用户。...在某些情况下,可以使用 setTimeout 对长时间运行的计算阻塞的,可以使用 setTimeout暂时放入异步队列中,从让页面得到更快的渲染。...例如,通过在单独的 setTimeout 调用中批处理复杂的计算,可以将它们放在事件循环中单独的“位置”上,这样可以争取为 UI 渲染/响应的执行时间。...这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。 你可能问:“JavaScript不是一个单线程的语言吗?”...Prefetching data(预取数据):为了优化你的网站或 web 应用程序并改进数据加载时间,你可以利用 Web Workers 提前加载和存储一些数据,以便在需要时稍后使用

    82210

    前端进阶之setTimeout 为什么会出现误差?

    其实在本质上,两个名词都是 CPU 工作时间片的一个描述。 进程(process) 指的是CPU 在 运行指令及加载和保存上下文所需的时间,放在应用上是指计算机中已运行的程序。...它被包含在 进程 之中,描述了执行一段指令所需的时间。 单线程:按代码书写顺序从头到尾,一行一行地执行代码,如果其中一行代码报错,那么剩下代码将不再执行。容易阻塞代码。...多线程:代码运行的环境不同,各线程独立,互不影响,避免阻塞。...如果当前 执行栈 所花费的时间大于 定时器 时间,那么定时器的回调在 宏任务(macrotask) 里,来不及去调用,所有这个时间会有误差。...我们看以下代码: setTimeout(function () { console.log('biubiu');}, 1000);某个执行时间很长的函数(); 如果定时器下面的函数执行要 5秒钟,

    93910

    JavaScript怎么模拟 delay、sleep、pause、wait 方法

    v接着出现。这是一种既简洁又有效的引入延迟的方法。 如果你只是为了这个来的,那太好了!但如果你对“为什么”和“怎么做”的原因感到好奇,还有更多可以学习的内容。...如果你需要很大的延迟,甚至有可能让整个程序崩溃。 那么应该怎么做呢?...; }, 2000); 优点:非阻塞性,易于实现,不需要了解 promises 或 async/await。 缺点:不适用于复杂的异步操作。没有错误处理。 何时使用:用于有时间间隔的简单序列。...缺点:阻塞整个线程,可能冻结UI或导致程序崩溃。 ⚠️ 强烈推荐:只有在你绝对需要暂停执行并且意识到其中的风险时才使用。...; }); 优点:非阻塞性,对异步操作有更多的控制。 缺点:需要理解promises。更长的promise链可能变得有点混乱。 何时使用:当你需要更多对时间和异步操作的控制时。

    3.4K40

    JavaScript多线程编程

    浏览器端JavaScript是以单线程的方式执行的,也就是说JavaScript和UI渲染占用同一个主线程,那就意味着,如果JavaScript进行高负载的数据处理,UI渲染就很有可能被阻断,浏览器就会出现卡顿...这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。 什么是web worker ?...这会带来一个问题,我们经常使用CDN来存储js文件,主线程的worker.js的域名指的是html文件所在的域,通过new Worker(url)加载的url属于CDN的域,带来跨域的问题,实际开发中我们不会吧所有的代码都放在一个文件中让子线程加载...3、数据的预取  对于一些有大量数据的前后台交互产品,可以新开一个线程专门用来进行数据的预取和缓冲数据,worker可以用在本地web数据库的行写入和更改,长时间持续的运行,不会被主线程上的活动(比如用户点击按钮...,从而极大减轻了因计算量大而造成 UI 阻塞而出现的界面渲染卡、掉帧的情况,并且更大程度地利用了终端硬件的性能。

    1.6K30

    浏览器加载解析渲染机制的全面解析

    UI 后端(UI backend)- 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口。...再下一步就是绘制,即遍历render tree,并使用UI后端层绘制每个节点。...开发者可以将脚本标识为defer,以使其阻塞文档解析,并在文档解析结束后执行。Html5增加了标记脚本为异步的选项,以使脚本的解析执行使用另一个线程。...所以,我们总结一下: css如果在js之前,阻塞js的执行,从而阻塞DOM tree构建 要想阻塞DOM tree构建,需要将js在body底部或者使用defer 9.2 js阻塞 我们将test.html...9.3 阻塞总结 我们分析如上几种情况,总结如下: html解析的过程中遇到script时,如果是嵌入脚本,执行并阻塞dom tree构建;如果是外链JS脚本,则会进行加载后执行,并阻塞dom tree

    1.1K10

    浏览器之性能指标-INP

    通常,这意味着将报告最糟糕的延迟,但如果一个页面收到许多交互,那么「只有其中最慢的一个会被报告」。...在页面加载过程中,可能延长输入延迟的一件事就是脚本执行。...除了使用setTimeout,我们还可以使用Web Worker在单独的线程上进行CPU密集型工作 ---- 避免长任务 缓解较长输入延迟的一种方法是避免长时间任务。...这可以防止集体工作成为一个长时间任务,阻塞主线程,从而允许其他本来需要在主线程上等待的交互更快地运行。 setTimeout是一种将任务分解的方法,因为传递给它的回调会在新任务中运行。...使用 content-visibility 属性,我们可以将元素的呈现方式设置为 auto,这样当元素不在视口内时,其内容就会被自动懒加载,只有当元素进入视口时,才会进行渲染。

    1.1K21
    领券