先不要往下看看了文章标题,你猜到是什么了吗? 提示:我说的是一种js函数类型
如果没有,那你就非常有必要往下看了。
如果猜到了,说明你很厉害,给你点个赞!
无论对于前端,还是后端,对回调函数都再熟悉不过了
简单了说,就是一个函数的参数还是一个函数
这个参数化的函数,可自定义逻辑代码,一般不能主动调用它,也不能调用
但是最终它会被执行
是不是正好符合我说的文章标题
常见用法
1. onclick事件
你没看错,最常用的clik事件其实就是一个回调函数!
从写法上看,我们通常将一个函数名作为参数传递给click事件方法。
当我们点击时,click会去调用,之前我们传递给他的函数
这是js中回调函数最典型也是最常用的一种
2. 自封装方法中的callback
直接上代码
//全局函数
function Func(val) {
if (typeof val === "string") {
console.log(val);
} else if (typeof val === "object") {
for (var item in val) {
console.log(item + ":" + val[item]);
}
}
}
// 两个参数,后一个是回调函数名
function getResult(opt, callback) {
callback(opt);
}
//调用
getResult({
name: "张三",
age: 18
}, Func);
复制代码
上面就是将回调函数专门拿出去实现,然后以参数的形式,放到另一个函数中,并调用它的其他参数
如果不单独拿出来,那回调函数就是一个匿名函数!
回调函数在执行时就是一个普通函数,并且可以给他传参,传递任何包含它的函数的属性作为回调函数的参数。
3. sort
js官方其实封装了很多方法,其参数就是回调函数
比如常用的promise,里面有两个回调函数
比如排序方法sort,里面可以自定义排序规则,这个规则逻辑就是写到一个回调方法中的
这里就拿sort举个简单的例子
var arr = [{
num: 1,
str: "abc"
}, {
num: 3,
str: "dds"
}, {
num: 2,
str: "adca"
}];
arr.sort(function(x, y) {
return x.num > y.num;
})
console.log(arr); //num按从小到大以此排列....
复制代码
自定义排序规则
不同的对象集合,其内部属性名肯定不一样,所以需要自定义排序规则
使得sort这个方法有更广泛的适用性
回调函数的运作
函数是js中第一类对象(优先级高)
对待对象和对待函数一样,可以像传递变量一样传递函数
在函数中返回函数,在其他函数中使用函数。
当我们将一个回调函数作为参数传递给另一个函数时,不仅仅传递了函数的定义。
我并没有在参数中执行函数,也并不传递像我们平时执行函数一样带一对小括号的函数。
注意:回到函数并不会马上执行,他会在包含它的函数内的某个特定时间点被“回调”!
<----- 这也说明了:我定义的,我没有调用,而他最终执行了!
另外:回调函数一般都是匿名函数,即使有名字,它依然在包含它的函数内通过arguments对象获取。
回调函数与闭包
回调函数就是闭包!!!
将一个回调函数作为变量传递给另一个函数时,这个回调函数在包含它的函数内的某一点执行,就好像这个回调函数是在包含它的函数中定义一样。这意味着回调函数本质上就是一个闭包。
闭包能够进入包含它的函数的作用域,因此回调函数能获取包含它的函数中的变量,以及全局作用域中的变量。
优点总结
其实回调函数就相当于预先埋好的一个锚点(或者说是地雷...),我埋的,我没有踩,最终它爆炸了 ---> 有没有很形象!
为了很好的提现回调的优点,这里再举一个例子
function myFunc(n1, n2, callback) {
if (callback == "add") {
return n1 + n2;
} else if (callback === "multi") {
return n1 * n2;
}
}
console.log(myFunc(2, 4, "add")); //6
console.log(myFunc(2, 4, "multi")); //8
复制代码
如上,如果不采用闭包的方式,要想实现加法运算和乘法运算,需要写两个方法
这里仅需要写一个方法足够了!
优点一:避免重复代码,让代码有更好的可维护性
function myFunc(n1, n2, callback) {
return callback(n1, n2);
}
console.log(myFunc(3, 6, function(x, y) {
return x - y;
})); //-3
复制代码
这个就跟上面js中的sort差不多了
我不管你内部什么逻辑规则,我空出来,谁调用,谁实现
由调用者自己来完善具体逻辑
优点二:可扩展性
另外,回调还可以让代码易读、易封装等特点
总之,非常实用且常用的一种函数类型
是每一个开发者必须要掌握的一种编程技巧(这样说明了它设计的优秀和不可或缺性)
文末总结
春天埋下一粒种子,我没有再去关心它,突然有一天,突然看到它已迎风盛长!
回调函数就是这样,不起眼,但是作用很大,并且离不开它。
因为它足够优秀(优点多),优秀到如同种子一样惊艳到人的地步
所以我们也要努力学习,使自己再任何地方都成为一个不可或缺的人。