setTimeout学习小结


Posted in Javascript onFebruary 08, 2017

大致介绍

今天看了一篇文章,觉得写得不错,所以学习了一下,这篇博客是我自己的理解和总结

原文:你应该知道的 setTimeout 秘密

主要内容:

 1、setTimeout原理

 2、setTimeout(function(){..},0)的意义

 3、setTimeout的this指向和参数问题

setTimeout原理

先来看一段代码:

var start = new Date();
 setTimeout(function(){
  console.log(new Date() - start);
 },500);
 while(new Date() - start <= 1000 ){}

最后输出的是1003(可能数字不同,但是都大于1000)

之所以会输出这样的数,是因为执行到setTimeout时,会把其中的代码经过500ms后放到执行队列中,但是之后执行while循环,while循环会占据计算机资源,要占据1000ms,在这1000ms中执行队列中的任务都得等待,直到while循环结束

可以看出setTimeout的原理就是在经过给定的时间后,将任务添加到队列中,等待cpu调度执行,它并不能保证任务在什么时候执行

setTimeout(function(){..},0)的意义

有时候见过这样的代码:

setTimeout(function(){
  //...........
 },0);

经过前面的学习,我会以为是当代码执行到setTimeout时,会立即将任务添加到执行队列中。其实不然,虽然给定的延迟执行时间是0,但是setTimeout有自己的最小延迟时间(根据浏览器的不同而不同),所以即使写了0s,但是setTimeout还是会在最小延迟时间后才添加任务到执行队列中

设置为0s的作用是为了可以改变任务的执行顺序!因为浏览器会在执行完当前任务队列中的任务,再执行setTimeout队列中积累的的任务

例如:

window.onload = function(){
 document.querySelector('#one input').onkeydown = function(){
  document.querySelector('#one span').innerHTML = this.value;
 };
 document.querySelector('#two input').onkeydown = function(){
  setTimeout(function(){
  document.querySelector('#two span').innerHTML = document.querySelector('#two input').value;
  },0)
 }
 }

会产生这样的问题:

setTimeout学习小结

可以发现采用第一种写法时,只会获取到键盘按下前,输入框中的内容

产生问题的原因是当我们按下键盘时,JavaScript引擎会执行keydown的事件处理程序,而更新输入框中的值是在此之后执行的,所以当获取输入框中的值(this.value)时,输入框中的值还为更新。

解决方法就是利用setTimeout,在更新了输入框的值后,在获取它的值

setTimeout的this指向和参数问题

setTimeout中回调函数的this是指向window的

例如:

var a = 1;
 var obj = {
  a : 2,
  output : function(){
  setTimeout(function(){
   console.log(a);
  },0);
  }
 }
 obj.output(); //1

但我们可以利用apply()、call()和bind()来改变this的指向

在setTimeout通常是两个参数,但是它可以由多个参数

例如:

setTimeout(function(a,b){
  console.log(a); //2
  console.log(b); //4
  console.log(a + b); //6
 },0,2,4);

可以看到,这些多的参数就是回调函数中要传入的参数

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js模拟点击事件实现代码
Nov 06 Javascript
关于JavaScript的面向对象和继承有利新手学习
Jan 11 Javascript
获取select元素被选中的文本内容的js代码
Jan 29 Javascript
jquery ajax跨域解决方法(json方式)
Feb 04 Javascript
浅谈Javascript中深复制
Dec 01 Javascript
node.js中的http.createClient方法使用说明
Dec 15 Javascript
jQuery实现自定义右键菜单的树状菜单效果
Sep 02 Javascript
jQuery使用正则验证15/18身份证的方法示例
Apr 27 jQuery
基于node打包可执行文件工具_Pkg使用心得分享
Jan 24 Javascript
微信小程序实现留言功能
Oct 31 Javascript
详解vue-cli 2.0配置文件(小结)
Jan 14 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
Mar 26 Javascript
jquery uploadify如何取消已上传成功文件
Feb 08 #Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
Feb 08 #Javascript
用move.js库实现百叶窗特效
Feb 08 #Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 #Javascript
Move.js入门
Feb 08 #Javascript
jquery ajaxfileupload异步上传插件使用详解
Feb 08 #Javascript
详解Javascript百度地图接口开发文档中的类和方法
Feb 07 #Javascript
You might like
php cookie 登录验证示例代码
2009/03/16 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
python Crypto模块的安装与使用方法
2017/12/21 Python
python自动化报告的输出用例详解
2018/05/30 Python
对python函数签名的方法详解
2019/01/22 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
Python通过socketserver处理多个链接
2020/03/18 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
《在山的那边》教学反思
2014/02/23 职场文书
鸿星尔克广告词
2014/03/21 职场文书
股份合作协议书
2014/04/12 职场文书
调查研究项目计划书
2014/04/29 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
七一建党节演讲稿
2014/09/11 职场文书
村委会贫困证明范本
2014/09/17 职场文书
2014年平安夜寄语
2014/12/08 职场文书
高三毕业评语
2014/12/31 职场文书
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript