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 解疑
Nov 11 Javascript
获取表单控件原始(初始)值的方法
Aug 21 Javascript
js中settimeout方法加参数
Feb 28 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
Sep 03 Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
详解使用JS如何制作简单的ASCII图与单极图
Mar 31 Javascript
es6学习笔记之Async函数的使用示例
May 11 Javascript
ES6新特性:使用export和import实现模块化详解
Jul 31 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
新手简单了解vue
May 29 Javascript
Vue实现背景更换颜色操作
Jul 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
一个颜色轮换的简单例子
2006/10/09 PHP
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
php 发送带附件邮件示例
2014/01/23 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
php简单日历函数
2015/10/28 PHP
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python方法生成txt标签文件的实例代码
2018/05/10 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
Django如何实现上传图片功能
2019/08/16 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
在python3中实现更新界面
2020/02/21 Python
python 伯努利分布详解
2020/02/25 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
python自动生成sql语句的脚本
2021/02/24 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
工程师岗位职责
2013/11/08 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
在js中修改html body的样式
2021/11/11 Javascript