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 相关文章推荐
javascript实现的鼠标链接提示效果生成器代码
Jun 28 Javascript
JS实现两个大数(整数)相乘
Apr 28 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
JavaScript组合拼接字符串的效率对比测试
Nov 06 Javascript
JS简单实现动画弹出层效果
May 05 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
Jquery attr()方法 属性赋值和属性获取详解
Apr 15 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
Feb 26 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
Sep 05 Javascript
tsconfig.json配置详解
May 17 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给图片添加文字水印方法汇总
2015/08/27 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
python日志logging模块使用方法分析
2019/05/23 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
自我鉴定书范文
2013/10/02 职场文书
摄影助理岗位职责
2014/02/07 职场文书
演讲稿格式范文
2014/05/19 职场文书
高中校园广播稿
2014/10/21 职场文书
委托证明范本
2014/11/25 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
慰问信格式
2015/02/14 职场文书
python如何在word中存储本地图片
2021/04/07 Python
MySQL GRANT用户授权的实现
2021/06/18 MySQL
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript