太震撼了,牛逼呀,我定义的,我没有调用它,最终他被执行了

本文介绍了回调函数的概念,常见用法如onclick事件、自封装方法中的callback及sort方法,强调了回调函数的运作原理,即不会立即执行,而是在特定时机被“回调”。回调函数与闭包的关系被提及,它们都是闭包,能访问外部作用域的变量。文章总结了回调函数的两大优点:避免重复代码和提高可扩展性,强调它是开发者必须掌握的编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先不要往下看看了文章标题,你猜到是什么了吗? 提示:我说的是一种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差不多了
我不管你内部什么逻辑规则,我空出来,谁调用,谁实现
由调用者自己来完善具体逻辑
优点二:可扩展性

另外,回调还可以让代码易读、易封装等特点
总之,非常实用且常用的一种函数类型
是每一个开发者必须要掌握的一种编程技巧(这样说明了它设计的优秀和不可或缺性)

文末总结

春天埋下一粒种子,我没有再去关心它,突然有一天,突然看到它已迎风盛长!
回调函数就是这样,不起眼,但是作用很大,并且离不开它。
因为它足够优秀(优点多),优秀到如同种子一样惊艳到人的地步
所以我们也要努力学习,使自己再任何地方都成为一个不可或缺的人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值