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 拾色器插件发布-jquery.icolor.js
Oct 20 Javascript
JQuery异步加载无限下拉框级联功能实现示例
Feb 19 Javascript
简单的js图片轮换代码(js图片轮播)
May 06 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
Jun 26 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
Dec 10 Javascript
js代码实现点击按钮出现60秒倒计时
Jan 28 Javascript
几种经典排序算法的JS实现方法
Mar 25 Javascript
Node.js的npm包管理器基础使用教程
May 26 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
Sep 16 Javascript
Vue实现可移动水平时间轴
Jun 29 Javascript
微信小程序实现转盘抽奖
Sep 21 Javascript
webpack的移动端适配方案小结
Jul 25 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与浏览器缓存的分析
2013/06/03 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
Python 获取当前所在目录的方法详解
2017/08/02 Python
python unittest实现api自动化测试
2018/04/04 Python
TensorFlow损失函数专题详解
2018/04/26 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
python mysql断开重连的实现方法
2019/07/26 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
医校毕业生自我鉴定
2014/01/25 职场文书
酒店管理求职信
2014/06/09 职场文书
天坛导游词
2015/02/02 职场文书
2015年人事科工作总结
2015/04/28 职场文书
2015年征兵工作总结
2015/07/23 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript