SetTimeout(延迟计时器)
延迟计时器
延迟多少时间执行, 执行函数的操作, 而且只执行一次
setTimeout ( )
第1 个参数: 函数
第2 个参数: 延迟时间 单位是ms
清除延时计时器
clearTimeout ( ) ;
最小时间为 4 毫秒,setTimeout是宏任务,需要到下次Loop,才能调用;
setTimeout 的返回值是一个数字,这个值为timeoutID
function bar ( ) {
console. log ( 'bar' )
const endTime = Date. now ( )
console. log ( 'cost time' , endTime - startTime)
}
function foo ( ) {
setTimeout ( bar, 0 ) ;
for ( let i = 0 ; i < 5000 ; i++ ) {
let i = 5 + 8 + 8 + 8
console. log ( i)
}
}
foo ( )
var name= 1 ;
var MyObj = {
name: 2 ,
test: 1 ,
showName: function ( ) {
console. log ( this . name, this . test) ;
}
}
setTimeout ( MyObj. showName, 1000 )
MyObj. showName ( )
const fn = MyObj. showName
setTimeout ( fn, 1000 )
在setTimeout里面,当执行到的时候,实际上就是在window下执行fn,此时的this ,就指向了window, 而不是原来的函数。
let startTime = Date. now ( )
function cb ( ) {
const endTime = Date. now ( )
console. log ( 'cost time' , endTime - startTime)
startTime = startTime
setTimeout ( cb, 0 ) ;
}
setTimeout ( cb, 0 ) ;
目的是为了优化后台页面的加载损耗以及降低耗电量。这一点你在使用定时器的时候要注意。
Chrome、Safari、Firefox 都是以 32 个 bit 来存储延时值的,32 bit 最大只能存放的数字是 2147483647 毫秒,这就意味着,如果 setTimeout 设置的延迟值大于 2147483647 毫秒(大约 24.8 天)时就会溢出,这导致定时器会被立即执行
let startTime = Date. now ( )
function foo ( ) {
const endTime = Date. now ( )
console. log ( 'cost time' , endTime - startTime)
console. log ( "test" )
}
var timerID = setTimeout ( foo, 2147483648 ) ;
function timer ( timeout) {
let i = 0 ;
time ( ) ;
function time ( ) {
if ( i < timeout) {
console. log ( i) ;
i++ ;
setTimeout ( time, 1000 ) ;
} else {
return ;
}
}
}
timer ( 10 ) ;