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 的全选(全非选)即取得被选中的值使用介绍
Nov 12 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
Sep 01 Javascript
轻量级的原生js日历插件calendar.js使用指南
Apr 28 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
JS控制TreeView的结点选择
Nov 11 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
Bootstrap实现提示框和弹出框效果
Jan 11 Javascript
深入掌握 react的 setState的工作机制
Sep 27 Javascript
three.js实现3D视野缩放效果
Nov 16 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 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/03/28 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
2017/09/11 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
Python中的startswith和endswith函数使用实例
2014/08/25 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
flask框架视图函数用法示例
2018/07/19 Python
Python读写zip压缩文件的方法
2018/08/29 Python
python简单验证码识别的实现方法
2019/05/10 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
python Scrapy框架原理解析
2021/01/04 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
邀请函的格式
2015/01/30 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers