回调函数
- 回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。
- 注意:调用回调函数时是不需要
()
的,直接使用函数名!
- 例子:下面reduce()方法的第一个参数就是回调函数。
回调函数与调用普通函数的区别
- 性能没有区别。
- 回调函数是作为参数传递的,操作更加灵活。
比如,你定义了函数a,b,c,那么使用回调函数时不用修改 a 的代码就可以让 a 调用 c、d、e….
当你调用普通函数的时候不修改代码只能在函数a内运行函数b,就失去了变量的灵活性。
补充:数组的reduce()方法
- reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。即,对数组每个元素执行回调函数,返回值用于下一次计算参数
- reduce()方法的参数由回调函数和一个初始值参数组成。
- 语法:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
- 语法理解:
reduce(function(回调返回的值,数组当前元素,当前元素序号值,调用reduce的数组) , 回调函数第一个参数的初始值);
- 返回值:返回计算结果
- 例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <body>
<p>点击按钮计算数组元素相加后的总和。</p> <button onclick="myFunction()">点我</button>
<p>数组元素总和: <span id="demo"></span></p>
<script> var numbers = [65, 44, 12, 4];
function getSum(total, num) { return total + num; } function myFunction(item) { document.getElementById("demo").innerHTML = numbers.reduce(getSum,0); } </script>
</body>
|
同步回调与异步回调
其实回调函数并不一定是同步/异步的,主要看我们的函数是否支持异步处理,一旦支持我们就当做异步回调来看。
同步回调
1 2 3 4 5 6 7 8 9 10 11
| var callback = function(arg3) { console.log('callback Totle is:' + arg3) }
function fn(arg1, arg2, cb) { var Total = arg1 + arg2; cb(Total); console.log('mainFunction Totle is:' + Total) }
fn(2, 2, callback)
|
执行结果为:
1 2
| callback Totle is:4 mainFunction Totle is:4
|
异步回调
js中的例子
1 2 3 4 5 6 7 8 9 10 11 12
| function f2() {
console.log('f2 finished') }
function f1(cb) {
setTimeout(cb,1000) console.log('f1 finished') }
f1(f2);
|
- js中的setTimeout()函数支持异步处理。
- 所以我们可以用setTimeout()来模拟耗时操作。得到的结果是:
1 2
| f1 finished f2 finished
|
nodejs中的例子
1 2 3 4 5 6 7 8
| var fs = require("fs");
fs.readFile('input.txt','utf-8', function (err, data) { if (err) return console.error(err); console.log(data.toString()); });
console.log("程序执行结束!");
|
执行的结果是:
1 2 3
| $ node app 程序执行结束! 我们来测试一下异步回调函数
|
- 上面例子中我们先创建了一个文件input.txt,里面的内容是:’我们来测试一下异步回调函数’
- 首先我们要明确,node中fs.readFile()读取文件内容是异步的。
- 因此程序执行到这儿的时候并不会阻塞,而是继续向后执行,当文件读取完毕之后再自动调用传入的匿名回调函数,因此出现了上面的结果。