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加解密 脚本解密
Feb 22 Javascript
jquery+css+ul模拟列表菜单具体实现思路
Apr 15 Javascript
浅谈JavaScript数据类型及转换
Feb 28 Javascript
jQuery实现的背景动态变化导航菜单效果
Aug 24 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
Feb 09 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
详解weex默认webpack.config.js改造
Jan 08 Javascript
Angular @HostBinding()和@HostListener()用法
Mar 05 Javascript
解决vue 绑定对象内点击事件失效问题
Sep 05 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
bootstrap-table后端分页功能完整实例
Jun 01 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笔试题
2009/08/04 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
28个JS验证函数收集
2010/03/02 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
在Django框架中编写Contact表单的教程
2015/07/17 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
pandas的相关系数与协方差实例
2019/12/27 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
Python调用Redis的示例代码
2020/11/24 Python
美国在线购物频道:Shop LC
2019/04/21 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
2014年银行客户经理工作总结
2014/11/12 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
人民检察院起诉书
2015/05/20 职场文书