setTimeout如何把时间设置为0

本文主要给大家介绍了关于settimeout时间设置为0的相关内容,settimeout( ) 是属于 window 的 method, 但我们都是略去 window 这顶层容器名称, 这是用来设定一个时间, 时间到了, 就会执行一个指定的 method,下面这篇文章主要给大家介绍了关于settimeout时间设置为0的相关资料,需要的朋友可以参考下。

1、开胃菜,setTimeout为何物

首先看一下w3school上面对于setTimeout的解释

setTimeout(fn,millisec) 方法用于在指定的毫秒数后调用函数或计算表达式。

很简单,setTimeout() 只执行 fn 一次,到底什么时候执行取决于第二个参数millisec设定的毫秒数,所以很多人习惯上称之为延迟,无非就是延迟一段时间后再执行里面的代码。

setTimeout(function(){ console.log('我是setTimeout');}, 1000);

登录后复制

正常情况下,我是setTimeout 这句话并不会马上输出而是等1000毫秒以后会在浏览器的控制台输出。

2、主菜,js是单线程的

OK,看一个例子,这个例子的输出结果是什么?

setTimeout(function(){ console.log(1);}, 0);console.log(2);console.log(3);

登录后复制

出乎一些人的意料,得到的结果竟然是2、3、1。这似乎不按套路出牌啊,明明是等待了0毫秒也就是不等待直接输出啊,为啥1却在最后输出了呢?

这就需要搞清楚一个很重要的概念:js是单线程的,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

其实很好理解,就像大家去超市买东西一样,所有买东西的人都需要在收银台排队结账,正常情况下每个收银台同一时间只能为一位顾客结账,这位顾客结账完成才能为下一位顾客服务。

而浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。

javascript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JS线程在运行JS程序。

GUI渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。但需要注意 GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。

事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。(当线程中没有执行任何同步代码的前提下才会执行异步代码)

其实,当js代码执行遇到setTimeout(fn,millisec)时,会把fn这个函数放在任务队列中,当js引擎线程空闲时并达到millisec指定的时间时,才会把fn放到js引擎线程中执行。

setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在”任务队列”的尾部添加一个事件,因此要等到同步任务和”任务队列”现有的事件都处理完,才会得到执行。

HTML5标准规定了setTimeout()的第二个参数的最小值(最短间隔),不得低于4毫秒,如果低于这个值,就会自动增加。在此之前,老版本的浏览器都将最短间隔设为10毫秒。另外,对于那些DOM的变动(尤其是涉及页面重新渲染的部分),通常不会立即执行,而是每16毫秒执行一次。这时使用requestAnimationFrame()的效果要好于setTimeout() 。

需要注意的是,setTimeout()只是将事件插入了”任务队列”,必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的时间执行。

3、甜品,setTimeout的妙用

其实setTimeout是有一些妙用的,这里简单列举几个。

函数去抖

让一个函数在一定间隔内没有被调用时,才开始执行被调用方法。比如当你在使用 google 搜索内容的时候,有些关键词输入到一半,谷歌会展示一个可选列表,根据你当前输入的内容作出的一个猜测联想。需要监听文字改变,每一次改变都会调用一次回调函数,现在需要的一种实现是在用户停止键盘事件一段时间后,去发送一个请求。

var debounce = function(method, context) { clearTimeout(method.tId); method.tId = setTimeout(function(){  method.call(context); },100);}

登录后复制

轮训任务

js中可以使用setInterval开启轮询,但是这种存在一个问题就是执行间隔往往就不是你希望的间隔时间。

比如有个轮询任务间隔是100ms,但是执行方法的时间需要450ms,那么在200ms、300ms、400ms本来是计划中执行任务的时间,浏览器发现第一个还未执行完,那么就会放弃2、3、4次的任务执行,并且在500ms之后再次执行任务,这样的话,其实再次执行的间隔就只有50ms。使用setTimeout构造轮询能保证每次轮询的间隔。

setTimeout(function () { console.log('我被调用了'); setTimeout(arguments.callee, 100);}, 100);

登录后复制

延迟js引擎的调用

var p = document.createElement('p');p.innerHTML = '我是一个p';p.setAttribute('style', 'width:200px; height:200px;background-color:#f00; ');document.body.appendChild(p);setTimeout(function() { console.log('我被调用了');}, 1000);

登录后复制

虽然setTimeout有一些妙用,但是他确实是在宏观任务队列中新增任务了,所以万万不能滥用啊。

相关推荐:

JS中setInterval和setTimeout实例分析

JavaScript中setTimeout()的使用详解

javascript函数setTimeout带参数用法实例详解

以上就是setTimeout如何把时间设置为0的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2783152.html

(0)
上一篇 2025年3月8日 16:45:00
下一篇 2025年3月8日 01:52:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 在angular中$http服务需要如何使用

    这次给大家带来在angular中$http服务需要如何使用,使用angular中$http服务的注意事项有哪些,下面就是实战案例,一起来看一下。 $http服务 $http(requestConfig)只是一个封装的XMLHttpReque…

    编程技术 2025年3月8日
    200
  • 上传图片时本地先预览如何实现

    这次给大家带来上传图片时本地先预览如何实现,实现上传图片时本地先预览的注意事项有哪些,下面就是实战案例,一起来看一下。 FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File …

    编程技术 2025年3月8日
    200
  • 在React组件中的this如何使用

    这次给大家带来在React组件中的this如何使用,在React组件中的this使用的注意事项有哪些,下面就是实战案例,一起来看一下。 React组件的this是什么 通过编写一个简单组件,并渲染出来,分别打印出自定义函数和render中的…

    2025年3月8日
    200
  • Bootstrap4的自定义设置

    这次给大家带来Bootstrap4的自定义设置,Bootstrap4自定义设置的注意事项有哪些,下面就是实战案例,一起来看一下。 Bootstrap是现在最流行的CSS框架,有许多网站、后台管理系统的样式都是基于Bootstrap设计的。然…

    2025年3月8日 编程技术
    200
  • js动态创建标签以及设置属性的方法

    这次给大家带来js动态创建标签以及设置属性的方法,js动态创建标签以及设置属性的注意事项有哪些,下面就是实战案例,一起来看一下。 当我们在写jsp页面时,往往会遇到这种情况:从后台获取的数据个数不确定,此时在前端写jsp页面时也就不确定怎么…

    编程技术 2025年3月8日
    200
  • 使用vue.js路由后失效如何解决

    新学了vue.js中的路由 在之前写的vue的demo上加上了简单的路由例子(来自vue-router 2),但是加上点击后只有地址栏变化,内容并不变.且之前用jquery写的一些效果也失效了.最后找到原因是因为同一个id被启动了两次(第一…

    编程技术 2025年3月8日
    200
  • 前端项目中如何搭建JQuery、Vue等开发环境

    这次给大家带来前端项目中如何搭建JQuery、Vue等开发环境 ,前端项目搭建JQuery、Vue等开发环境的注意事项有哪些,下面就是实战案例,一起来看一下。   vscode是微软开发的的一款代码编辑器,就如官网上说的一样,vscode重…

    2025年3月8日 编程技术
    200
  • esLint的参数怎么设置

    这次给大家带来esLint的参数怎么设置,esLint参数设置的注意事项有哪些,下面就是实战案例,一起来看一下。 package.json { “name”: “testEsLint”, “version”: “1.0.0”, “descr…

    编程技术 2025年3月8日
    200
  • JS中DOM如何操作

    dom即 document object model 是 w3c (万维网联盟)的标准,dom定义访问 html 和 xml 的标准 : w3c文档对象模型(dom)是中立于平台和语言的接口, 它允许程序 和脚本 动态的访问和更新文档的内容…

    编程技术 2025年3月8日
    200
  • Node.js如何开发微信墙

    这次给大家带来Node.js如何开发微信墙,Node.js开发微信墙的注意事项有哪些,下面就是实战案例,一起来看一下。 验证服务器有效性 接收用户通过微信订阅号发给服务器的消息 解析收到的XML文本消息格式为JSON 用模板构造应答用户的X…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论