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 EasyUI API 中文文档 可调整尺寸
Sep 29 Javascript
js 幻灯片的实现
Dec 06 Javascript
javascript实现可改变滚动方向的无缝滚动实例
Jun 17 Javascript
鼠标滚轴控制文本框值的JS代码
Nov 19 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
Jan 07 Javascript
javascript读写json示例
Apr 11 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
jQuery复制节点用法示例(clone方法)
Sep 08 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
Jan 31 jQuery
angularjs 获取默认选中的单选按钮的value方法
Feb 28 Javascript
浅谈vue.watch的触发条件是什么
Nov 07 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
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
Prototype RegExp对象 学习
2009/07/19 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
初步理解Python进程的信号通讯
2015/04/09 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
Python  Django 母版和继承解析
2019/08/09 Python
Django发送邮件功能实例详解
2019/09/02 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
Python利用命名空间解析XML文档
2020/08/10 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
高一学生期末评语
2014/04/25 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
长江三峡导游词
2015/01/31 职场文书