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 相关文章推荐
JQuery Tips(3) 关于$()包装集内元素的改变
Dec 14 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
Jan 11 Javascript
自定义jQuery选项卡插件实例
Mar 27 Javascript
JavaScript实现简单图片翻转的方法
Apr 17 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
May 09 Javascript
Bootstrap表格和栅格分页实例详解
May 20 Javascript
jquery中取消和绑定hover事件的实现代码
Jun 02 Javascript
解析利用javascript如何判断一个数为素数
Dec 08 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
聊聊鉴权那些事(推荐)
Aug 22 Javascript
Array.filter中如何正确使用Async
Nov 04 Javascript
JavaScript实现显示和隐藏图片
Apr 29 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
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
详解python之heapq模块及排序操作
2019/04/04 Python
创建Django项目图文实例详解
2019/06/06 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
python xlsxwriter模块的使用
2020/12/24 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
西部世纪面试题
2014/12/05 面试题
物业电工岗位职责
2013/11/20 职场文书
幼儿园教学管理制度
2014/02/04 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
社区服务活动总结
2014/05/07 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
给男朋友的道歉短信
2015/05/12 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书