回调函数
学习回调函数必须要记住四句话:
1.回调函数就是把一个被当作函数参数的函数。
2.我们仅仅传递了函数定义。我们并没有在参数中执行函数。
3.回调函数被当作参数传递到另一个函数中后,其实可以看作是在那个函数内定义了一个函数,因此仅能在那个函数中调用你传递的函数。
4.回调函数并不会马上被执行。它会在包含它的函数内等待被执行。
下面举一个重写forEach()函数的例子:
Array.prototype.myEach = function(exp){
for(var i = 0; i<this.length;i++){
exp(this[i])
}
}
function myforEach(a,exp){
exp(a)
}
var a =[1,3,34,2,74]
myforEach(a,(s)=>console.log(s));
console.log("---------------------------")
a.myEach((s)=>console.log(s))
解析:
//给Array函数的函数原型中新添加一个函数,该函数接受一个参数为函数的参数
//注:如何看出参数为函数呢?
因为下面的代码中执行了exp(this[i]),他的参数后面跟了小括号,小括号是函数调用的意思,所以它的参数必须是函数
Array.prototype.myEach = function(exp){
for(var i = 0; i<this.length;i++){
exp(this[i])
//该函数执行过程:进行一个for循环,该循环的判断条件是i是否小于调用它的数组的长度,小于则继续
每次for循环都会调用一次exp()函数
}
}
//创建一个函数,该函数接受两个参数,一个变量,一个函数
//函数执行:该函数会执行exp(),该函数接受的参数就是另一个参数a
function myforEach(a,exp){
exp(a)
}
var a =[1,3,34,2,74]
//给上面定义的函数传实参,第一个参数是a数组,第二个参数是一个匿名函数(没有名字的函数)
myforEach(a,(s)=>console.log(s));
//这里可以看作是把一个函数体当作参数传递给了myforEach()函数,这个函数体就是一个回调函数,完整写就是:
function x(s){
console.log(s);//s是它的一个形参,该函数的作用是把s打印到控制台上
}
//这时再看上面的myforEach函数声明,a数组和回调函数进入myforEach以后,执行exp就表示的是回调函数,然后执行
exp(a)就是执行了
function x(a){
console.log(a);
}
//所以a数组会被打印输出
console.log("---------------------------")
//这个同理
a.myEach((s)=>console.log(s))