本篇介绍了回调函数的概念,回调函数应用的两个函数:setTimeout函数、setInterval函数。
阅读时间20~30分钟。
前面一篇我们讲解了函数声明的几种方式,我们知道了函数可以赋值给一个变量,是一个数据类型。
既然是一个变量,那么是不是就可以当做参数传递给其他函数呢?
回调函数不是一种具体的函数,而是一种函数的使用方式,由此我们给出定义:
将函数作为参数传递给另外一个函数,然后在另外一个函数内调用这个函数。
简单示例:
// 函数f,接收一个函数类型的参数:func function f(func) { func(); }
我们声明了一个函数f,然后它接收一个参数 func,是一个函数类型,既然是函数,在函数f内就可以直接调用了。
在声明一个函数b:
function b(){ console.log(1); }
现在来调用一下 函数f,传入函数b:
f(b); // 控制台输出1
最终,控制台输出:1。
当然我们也可以直接传入一个匿名函数:
f(function(){ console.log(1); });
虽然这边处理的还不完善,但是这个就是回调函数最简单的原型了,在js语言中大量使用了这种方式,下面我们尝试应用一下。
js语言中大量使用回调函数处理的机制,比如常见的两个定时器:setTimeout、setInterval,还有事件机制等等。
这边我们先学习两个定时器 setTimeout、setInterval,事件机制我们留到后续讲解bom模型的时候再进行说明。
setTimeout 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。
语法格式有如下两种:
setTimeout(要执行的代码, 等待的毫秒数) setTimeout(函数, 等待的毫秒数)
其中:
第一个参数 是要执行的代码,可以一段代码或者是一个函数。 第二个参数 是一个数字,以毫秒为单位,例如:1000,表示1秒。
示例1,3秒后弹出提示框,显示:你好。
setTimeout("alert('你好')", 3000);
这边是一个非常简单的示例,如果我们要实现一个比较复杂的功能,用函数封装就比较好了。
示例2,3秒后在控制台输出1~10。
因为这边涉及到一个循环语句,用函数进行封装会更加合适。
setTimeout(function() { for (let i = 1; i <= 10; i++) { console.log(i); } }, 3000);
这边第一个参数是一个函数,传递给 setTimeout 函数,setTimeout 函数内部过了3000ms后,就会调用这个函数了。
setInterval 函数类似 setTimeout,只是 setInterval 是每间隔指定的毫秒数就调用函数或计算表达式一次。
语法格式有如下两种:
setInterval(要执行的代码, 间隔的毫秒数) setInterval(函数, 间隔的毫秒数)
其中:
第一个参数 是要执行的代码,可以一段代码或者是一个函数。 第二个参数 是一个数字,以毫秒为单位,例如:1000,表示1秒。
示例1,在页面间隔每秒分别打印1,2,3,4,…。
let i = 1; setInterval(function() { document.write(i); i++; }, 1000);
setInterval 在js中应用广泛,经常用来做定时器类相关的东西。
示例2,在页面依次从1秒计时到10秒,然后结束。
1)首先需要有一个地方显示数字,我们写一个div用来显示数字:
<div id="num"></div>
2)开启定时器,使用 dom 模型操作div的内容:
let i = 1; setInterval(function() { document.getElementById("num").innerHTML = i; i++; }, 1000);
只是这个定时器好像跑了,就停不下来了,我们可以用 clearInterval 进行终止。
3)终止定时器,setInterval 返回一个变量timer,然后调用 clearInterval 函数终止:
let i = 1; let timer = setInterval(function() { document.getElementById("num").innerHTML = i; i++; if (i > 10) { clearInterval(timer); // 终止定时器 } }, 1000);