js定时器setTiemout、setInterval

访客4年前关于黑客接单667

*** 提供了一些原生方式来实现延时去执行某一段代码,下面来简朴先容一下setTiemout、setInterval、setImmediate、requestAnimationFrame。


一、什么是定时器

*** 提供了一些原生方式来实现延时去执行某一段代码,下面来简朴先容一下。

setTimeout: 设置一个定时器,在定时器到期后执行一次函数或代码段

var timeoutId = window.setTimeout(func[, delay, param1, param2, ...]);
var timeoutId = window.setTimeout(code[, delay]);
  • timeoutId: 定时器ID
  • func: 延迟后执行的函数
  • code: 延迟后执行的代码字符串,不推荐使用原理类似eval()
  • delay: 延迟的时间(单米:毫秒),默认值为0
  • param1,param2: 向延迟函数通报而外的参数,IE9以上支持

setInterval: 以牢固的时间距离重复挪用一个函数或者代码段

var intervalId = window.setInterval(func, delay[, param1, param2, ...]);
var intervalId = window.setInterval(code, delay);
  • intervalId: 重复操作的ID
  • func: 延迟挪用的函数
  • code: 代码段
  • delay: 延迟时间,没有默认值

setImmediate: 在浏览器完全竣事当前运行的操作之后立刻执行指定的函数(仅IE10和Node 0.10+中有实现),类似setTimeout(func, 0)

var immediateId = setImmediate(func[, param1, param2, ...]);
var immediateId = setImmediate(func);
  • immediateId: 定时器ID
  • func: 回调

requestAnimationFrame: 专门为实现高性能的帧动画而设计的API,然则不能指定延迟时间,而是凭据浏览器的刷新频率而定(帧)

var requestId = window.requestAnimationFrame(func);
  • func: 回调

上面简朴的先容了四种 *** 的定时器,而本文将会主要先容对照常用的两种:setTimeout和setInterval。


二、举个栗子

基本用法

// 下面代码执行之后会输出什么?
var intervalId, timeoutId;

timeoutId = setTimeout(function () {
    console.log(1);
}, 300);

setTimeout(function () {
    clearTimeout(timeoutId);
    console.log(2);
}, 100);

setTimeout('console.log("5")', 400);

intervalId = setInterval(function () {
    console.log(4);
    clearInterval(intervalId);
}, 200);

// 划分输出: 2、4、5


setInterval 和 setTimeout的区别?

// 执行在面的代码块会输出什么?
setTimeout(function () {
    console.log('timeout');
}, 1000);

setInterval(function () {
    console.log('interval')
}, 1000);

// 输出一次 timeout,每隔1S输出一次 interval

/*--------------------------------*/

// 通过setTimeout模拟setInterval 和 setInterval有啥区别么?
var callback = function () {
    if (times++ > max) {
        clearTimeout(timeoutId);
        clearInterval(intervalId);
    }

    console.log('start', Date.now() - start);
    for (var i = 0; i < 990000000; i++) {}
    console.log('end', Date.now() - start);
},
delay = 100,
times = 0,
max = 5,
start = Date.now(),
intervalId, timeoutId;

function imitateInterval(fn, delay) {
    timeoutId = setTimeout(function () {
        fn();

        if (times <= max) {
            imitateInterval(fn ,delay);
        }
    }, delay);
}

imitateInterval(callback, delay);
intervalId = setInterval(callback, delay);

若是是setTimeout和setInterval的话,它俩仅仅在执行次数上有区别,setTimeout一次、setIntervaln次。

而通过setTimeout模拟的setInterval与setInterval的区别则在于:setTimeout只有在回调完成之后才会去挪用下一次定时器,而setInterval则不管回调函数的执行情况,当到达划定时间就会在事宜行列中插入一个执行回调的事宜,以是在选择定时器的方式时需要思量setInterval的这种特征是否会对你的营业代码有什么影响?


setTimeout(func, 0) 和 setImmediate(func)谁更快?(仅仅是好奇,才写的这段测试)

console.time('immediate');
console.time('timeout');

setImmediate(() => {
    console.timeEnd('immediate');
});

setTimeout(() => {
    console.timeEnd('timeout');
}, 0);

在Node. *** v6.7.0中测试发现setTimeout更早执行


面试题

下面代码运行后的效果是什么?

// 问题一
var t = true;
 
setTimeout(function(){
    t = false;
}, 1000);
 
while(t){}
 
alert('end');

/*--------------------------------*/

// 问题二
for (var i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(i);
    }, 0);
}

/*--------------------------------*/

// 问题三
var obj = {
    msg: 'obj',
    shout: function () {
        alert(this.msg);
    },
    waitAndShout: function() {
        setTimeout(function () {
            this.shout();
        }, 0);    
    }
};
obj.waitAndShout();

相关文章

小学生散文100篇(小学生必背美文80篇)

  大家都知道,高考语文作文的成绩是60分或70分,这占了非常大的占比。一般来说,它必须有一个自身决策的定义,一个自身挑选的设计风格和不少于800字。仅仅一篇好文章不太可能一蹴而就。它必须自小塑造。那...

诗圣是谁?(杜甫何以被称“诗圣”)

孔子就曾经说过“不学诗,无以言”,对中华民族而言,诗歌可以说是最重要的文化基因之一,诗歌不仅是诗人文才的表现,更是一个时代的忠实纪录。说到写诗,有唐一代可谓是诗歌的时代,只要是中国人,就不会不怀念长安...

第一黑客技术站,找黑客改学信网,黑客在那里那里找

2,crossdomain.xml的装备是过分授权的,譬喻本文最初截图中的装备。器械 : 固然仍是明小子了最后用 RMI 绑定实例目的设施,并运用 JNDI 去获取并挪用目的设施(CallServi...

黑客帝国03集(黑客帝国3在线观看)

黑客帝国03集(黑客帝国3在线观看)

本文导读目录: 1、黑客帝国1,2,3的剧情详细介绍! 2、黑客帝国1,2,3讲的是什么? 3、能发下黑客帝国3:矩阵革命.720p.国英双语.BD中英双字的种子或下载链接么? 4、黑客帝...

qq免密码万能登陆器,淘宝上如何找黑客,找黑客盗号一般多少钱

and(selectcount(*)from[admin])判别是否存在admin表段B374K十分简略,简略到只要一个php文件,可是功用却十分十分强壮。 功用包含:  一年一度的澳洲CySCA C...

12306全年售票30亿张怎么回事?12306全年售票30亿张数字惊呆网友

12306客票系统是全球交易量最大的票务系统,平均一年售出30亿张火车票,这些火车票首尾相接可以绕地球7圈。 今天,全路客票系统监控中心首次对外开放,记者带您走进12306,聊聊买票那些事儿。 2...