setTimeout和setInterval的使用的时候的问题总结
this的指向问题
由setTimeout()调用的代码运行在与所在函数完全分离的执行环境上。这会导致,这些代码中包含的 this 关键字在非严格模式会指向 window (或全局)对象
例子(来自MDN)
let myArray = ["zero", "one", "two"];
myArray.myMethod = function (sProperty) {alert(arguments.length > 0 ? this[sProperty] : this);
};myArray.myMethod(); // prints "zero,one,two"
myArray.myMethod(1); // prints "one"
使用定时器后this改变
setTimeout(myArray.myMethod, 1000); // prints "[object Window]" after 1 second
setTimeout(myArray.myMethod, 1500, "1"); // prints "undefined" after 1.5 seconds
// 对定时器其设置call也是没有
setTimeout.call(myArray, myArray.myMethod, 2000); // error: "NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype object"
setTimeout.call(myArray, myArray.myMethod, 2500, 2); // same error
解决方法
zqx:function(){myArray.myMethod()}这个函数中的this依旧是window;但是myArray.myMethod()中的this依旧是myArray
// 一个通用的方法是用包装函数来设置this
setTimeout(function(){myArray.myMethod()}, 2000); // prints "zero,one,two" after 2 seconds
setTimeout(function(){myArray.myMethod('1')}, 2500); // prints "one" after 2.5 seconds
// 将执行函数用bing绑定
let myArray = ['zero', 'one', 'two'];
myBoundMethod = (function (sProperty) {console.log(arguments.length > 0 ? this[sProperty] : this);
}).bind(myArray); myBoundMethod(); // prints "zero,one,two" because 'this' is bound to myArray in the function
myBoundMethod(1); // prints "one"
setTimeout(myBoundMethod, 1000); // still prints "zero,one,two" after 1 second because of the binding
setTimeout(myBoundMethod, 1500, "1"); // prints "one" after 1.5 seconds
zqx:这里和上面对定时器绑定call是不同的哦,这里是直接对执行函数绑定
如果当前任务执行时间过久,会影延迟到期定时器任务的执行
在使用 setTimeout 的时候,有很多因素会导致回调函数执行比设定的预期值要久,其中一个就是当前任务执行时间过久从而导致定时器设置的任务被延后执行。我们先看下面这段代码:
function bar() {console.log('bar')
}
function foo() {setTimeout(bar, 0);for (let i = 0; i < 5000; i++) {let i = 5+8+8+8console.log(i)}
}
foo()
这段代码中,在执行 foo 函数的时候使用 setTimeout 设置了一个 0 延时的回调任务,设置好回调任务后,foo 函数会继续执行 5000 次 for 循环。
通过 setTimeout 设置的回调任务被放入了消息队列中并且等待下一次执行,这里并不是立即执行的;要执行消息队列中的下个任务,需要等待当前的任务执行完成,由于当前这段代码要执行 5000 次的 for 循环,所以当前这个任务的执行时间会比较久一点。这势必会影响到下个任务的执行时间。
最小延时和最大延时
最小:在浏览器中,setTimeout()/setInterval() 的每调用一次定时器的最小间隔是4ms
最大:包括 IE, Chrome, Safari, Firefox 在内的浏览器其内部以32位带符号整数存储延时。这就会导致如果一个延时(delay)大于 2147483647 毫秒 (大约24.8 天)时就会溢出,导致定时器将会被立即执行。
setTimeout和setInterval的使用的时候的问题总结相关推荐
- javascript requestAnimationFrame 解决 setTimeout、setInterval 时间不准的方法。
javascript requestAnimationFrame 解决 setTimeout.setInterval 时间不准的方法. 取代 setInterval <!DOCTYPE html ...
- setTimeOut()和setInterval()的用法
setTimeOut()和setInterval()的用法 setTimeOut(function(){},1000); 在特定时间之后调用函数,只调用一次 setInterval(function( ...
- setTimeout和setInterval实现定时器的区别
这两个方法都能够用来实现在一个固定时间段之后去运行JavaScript.只是两者各有各的应用场景. 方 法 实际上,setTimeout和setInterval的语法相同.它们都有两个参数,一个是将要 ...
- js中计时器setTimeout、setInterval、requestAnimationFrame区别
转载自:https://www.cnblogs.com/xiaohuochai/p/5777186.html 本文仅用于作为学习笔记 计时器一直是javascript动画的核心技术.而编写动画循环的关 ...
- setTimeout和setInterval的使用
(节选自JavaScript精粹) 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript.不过两者各有各的应用场景. 方 法 实际上,setTimeout和setInterval的语 ...
- JavaScript———从setTimeout与setInterval到AJAX异步
setTimeout与setInterval执行 首先我们看一下以下代码打印结果 1 2 3 4 5 6 7 console.log(1); setTimeout(function() { conso ...
- js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)...
javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...
- setTimeout和setInterval你真的了解吗?
setTimeout和setInterval这两个函数, 大家肯定都不陌生, 但可能并不是每个用过这两个方法的同学, 都了解其内部的实质, 甚至可能会错误的把两个实现定时调用的函数理解成了类似thre ...
- js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法
setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTi ...
- setTimeout 和 setInterval
由于 JavaScript 是异步的,可以使用 setTimeout 和 setInterval 来计划执行函数. 注意: 定时处理不是ECMAScript 的标准,它们在DOM (文档对象模型) 被 ...
最新文章
- Java容器类研究4:ArrayList
- 跨平台移动开发_PhoneGap 使用Accelerometer 加速器
- Spring框架相关问题
- go 在windows下使用redis
- 【博客项目】—用户新增功能(九)
- python消息队列celery_python—Celery异步分布式
- 如何在虚拟机上安装wsus服务器,如何在Hyper-V虚拟机上安装WSUS服务器技巧_Hyper-V...
- rockchip的pwm驱动框架
- Activiti流程引擎与业务整合方案
- 国美做手机、天猫玩魔盒……电商做产品到底会怎么辣眼睛
- Trie Tree和Radix Tree
- osu计算机专业排名,OSU计算机专业有奖学金啦~
- 端口映射原理,公网和内网,NA
- ROS routeros mikrotik路由器CVE-2018-14847漏洞
- vc控制计算机关机,192上位机VC MFC实现电脑的重启关机注销功能
- 大量C语言、C++、C#、VC编程相关书籍下载
- 85款中国风字体!超级好看的古风系列
- 网页中引入网易云音乐,贴边隐藏
- Excel粘贴长文本数字 精度丢失
- dpkg 依赖关系问题-仍未被配置