一、setTimeout
setTimeout(code,millisec)
code可以是方法也可以是字符串
var timeout = setTimeout(
'console.log("this is a timeout")'
, 1000);
console.log("this is for test")
// this is for test
// this is a timeout
此时第一个参数为字符串,setTimeout()会将字符串解析成js代码,然后在1秒后将内容输出到控制台,当字符串无法解析时,控制台报错。另外这种方式,会造成javascript引擎进行两次解析,降低性能,甚至有可能造成内存泄漏,不建议使用。
关于setTimeout的隐患
内存泄漏:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
setTimeout当第一个参数为字符串的时候,就会有内存泄漏。
setTimeout(function test1() {
var a = 1;
console.log(a);
}, 0)
setTimeout((function test2() {
var b = 1;
console.log(b);
}).toString(), 0)
test1 // Uncaught ReferenceError: test1 is not defined
test2 // ... (打印出 test2 的函数体)
会发现,当第一个参数为函数时,回调函数执行完毕后,test1函数被销毁,其所使用内存也被释放;当第一个参数为字符串时,test2却始终存在,它没有被销毁,始终占据着内存,也就造成了内存泄漏所以让我们需要使用 setTimeout时,一定要注意,第一个参数必须传入一个函数。
二、setInterval
setInterval()方法在使用的时候有几个注意事项。
-
setInterval() 无视代码错误、对自己调用的代码是否报错漠不关心。即使调用的代码报错了,它依然会持续的调用下去
-
setInterval() 无视网络延迟。假设你每隔一段时间就通过Ajax轮询一次服务器。某些原因(服务器过载、临时断网、流量剧增、用户带宽受限,等等),你的请求要花的时间远比你想象的要长。但setInterval不在乎。它仍然会按定时持续不断地触发请求,最终你的客户端网络队列会塞满Ajax调用。
-
setInterval不保证执行。与setTimeout不同,你并不能保证到了时间间隔,代码就准能执行。如果你调用的函数需要花很长时间才能完成,那某些调用会被直接忽略。
setTimeout()也可以通过调用自己,实现setInterval()的效果 所以setInterval()能不用尽量不用。