当前位置: 首页 > news >正文

setTimeout和setInterval区别,以及定时器的传参功能

setTimeout和setInterval都属性Javascript中的定时器,可以规定延迟时间再执行某个操作,不同的是setTimeout在规定时间后执行完某个操作就停止了,而setInterval则可以一直循环下去。

另外,setTimeout和setInterval还能通过扩展运算符形式进行传参;现在IE10及以上版本,其它主流浏览器中,都已支持。

一.setTimeout使用

setTimeout()方法用于指定的毫秒数后调用函数或计算表达式。

1.1 语法:

setTimeout(code, millisec)

1.2 实例:

setTimeout(function(){
  console.log('执行了...')
}, 1000);

1.3 setTimeout循环执行多次:

      由于setTimeout只执行一次,这里在满足条件情况下,运行执行函数即可。

var index = 0;

function callback(){
  //开始计时
  setTimeout(function(){
    //循环执行5次后,结束计时
    if(index<5){
     callback();
    }

    console.log('执行次数', index++);
  }, 3000)
}

callback();

输出结果:

1.4 清除setTimeout计时器

setTimeout计时器虽然只执行一次,但在一些特殊场景下,需在终止即将执行的计时函数,这时则需要用到clearTimeout来。比如Vue开发时,页面在无感刷新情况下,不消除之前定义的执行函数,则会出现重复累加;又或者在满足一定条件后,需要将之前定义好执行函数终止掉。具体如下:

var index = 0,
    handle = null;

function callback(){
  clearTimeout(handle);

  //开始计时
  handle = setTimeout(function(){
    //循环执行5次后,结束计时
    if(index<5){
     callback();
    }

    console.log('执行次数', index++);
  }, 3000)
}

callback();

二、setInterval使用

setInterval()方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。

setInterval()方法会不停地调用函数,直到clearInterval()被调用或窗口被关闭。

2.1 语法

setInterval(code, millisec)

2.2 实例

由于setInterval设定计时周期后,则会一直执行下去,所以在满足特定条件情况下,通过clearInterval来结束计时功能。代码如下:

var index = 0,
    handle = null;

function callback(){
  //循环执行6次后,结束计时
  if(index>=5){
   clearInterval(handle);
  }

  console.log('执行次数', index++);
}

//开始计时
handle = setInterval(callback, 3000)

输出结果:

 

三、setTimeout和setInterval的传参功能

在setTimeout和setInterval中除了定义执行函数和执行周期(毫秒)外,还可以通过扩展运算符的形式,追加入参数据,这在很多文档中并未涉及到的。

3.1 setTimeout参数

参数描述
func必需。要执行的javascript代码串,也可以是一个函数
time必需。执行周期(毫秒数)
param1, param2, ...可选。传入执行函数其他参数

语法:

setTimeout(func, time, ...)

3.2 setInterval参数

参数描述
func必须。要执行的javascript代码串,也可以是一个函数
time必须。执行周期(毫秒数)
param1, param2, ...可选。传入执行函数其他参数

语法:

setInterval(func, time, ...)

3.2 案例

//传入参数a和b,计算求和
setTimeout(function(a, b){
  console.log(a + '+' + b + '=' + (a+b));
}, 3000, 5, 10);


//传入参数a和b,计算总和,大于100终止
var total = 0,
    handle = setInterval(function(a, b){
      total += a + b;

      console.log('total:', total);

      if(total>100){
        clearInterval(handle);
      }
    }, 3000, 10, 30);

输出结果:

 3.3 for中添加定时器

由于setTimeout的执行函数运行是,for循环早已结果,故 i 的值已递增为5,所以5个定时器执行出的结果都为5。

//未通过定时器传入参数
for(var i = 0; i < 5; i++){
  setTimeout(function(){
    console.log('value:', i);
  }, 2000*(i+1));
}

输出结果:

//通过定时器会传入参数
for(var i = 0; i < 5; i++){
  setTimeout(function(value){
    console.log('value', value);
  }, 2000*(i+1), i);
}

输出结果:

 

四、实现原理

在低版本中,无法实现传参功能,可以自定义实现同样效果,代码如下:

var _timeout = setTimeout;
//改写setTimeout定时器
window.setTimeout = function(callback, time){
  //获取除callback和time以外的参数,并以数组形式返回
  var args = Array.prototype.slice.call(arguments, 2);
  //定义新的执行函数
  var _cb = function(){
    callback.apply(null, args);
  }
  //定义setTimeout定时器
  _timeout(_cb, time);
}

//定义计时器
window.setTimeout(function(a, b){
  console.log('a:'+a, 'b:'+b);
}, 1000,  5, 100);

输入结果:

 

相关文章:

  • 【数学分析笔记04】数列与数列极限
  • 1、设计模式的简介
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • deepstream--nvinfer
  • python+vue+elementui企业会议管理系统django
  • centos 部署java环境,拷贝jar包并运行
  • 支持在线写SQL的Oracle学习免费网站(个人常使用)
  • ESP8266-Arduino编程实例-SHT20温湿度传感器驱动
  • 【web-代码审计】(14.5)PHP
  • Waline评论服务docker自部署手册 + 无需备案域名配置
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • C++后台开发学习路线(已多人拿下腾讯后台开发)
  • 中值滤波器 median filter
  • 基于ssm的图书(借阅)管理系统
  • linux内核中的I2C
  • [译]CSS 居中(Center)方法大合集
  • 【Leetcode】104. 二叉树的最大深度
  • echarts的各种常用效果展示
  • Fastjson的基本使用方法大全
  • golang中接口赋值与方法集
  • HTTP--网络协议分层,http历史(二)
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript DOM 10 - 滚动
  • JavaScript-Array类型
  • Linux各目录及每个目录的详细介绍
  • magento2项目上线注意事项
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • TypeScript实现数据结构(一)栈,队列,链表
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue自定义指令实现v-tap插件
  • 从零搭建Koa2 Server
  • 分享几个不错的工具
  • 规范化安全开发 KOA 手脚架
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 前端存储 - localStorage
  • 区块链将重新定义世界
  • 什么软件可以剪辑音乐?
  • 实战|智能家居行业移动应用性能分析
  • 微信小程序--------语音识别(前端自己也能玩)
  • 项目管理碎碎念系列之一:干系人管理
  • 赢得Docker挑战最佳实践
  • 源码安装memcached和php memcache扩展
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​批处理文件中的errorlevel用法
  • #、%和$符号在OGNL表达式中经常出现
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #define、const、typedef的差别
  • #pragma once
  • $L^p$ 调和函数恒为零
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (70min)字节暑假实习二面(已挂)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (每日持续更新)jdk api之FileReader基础、应用、实战