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学习5 jQuery事件模型
Feb 07 Javascript
javascript常用方法汇总
Dec 02 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
js实现音乐播放控制条
Sep 09 Javascript
ES6中Array.includes()函数的用法
Sep 20 Javascript
vue.js实现只弹一次弹框
Jan 29 Javascript
Vue使用NPM方式搭建项目
Oct 25 Javascript
Jquery实现获取子元素的方法分析
Aug 24 jQuery
Node.js中console.log()输出彩色字体的方法示例
Dec 01 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
Feb 02 Javascript
three.js欧拉角和四元数的使用方法
Jul 26 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 ajax 分页类代码
2008/11/13 PHP
PHP之COOKIE支持详解
2010/09/20 PHP
php笔记之常用文件操作
2010/10/12 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
JavaScript常用数学函数用法示例
2018/05/14 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
Python使用turtule画五角星的方法
2015/07/09 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
安全员岗位职责
2013/11/11 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
我为自己代言广告词
2014/03/18 职场文书
平安工地汇报材料
2014/08/19 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
四年级作文之植物
2019/09/20 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python