在百度百科中,回调函数的定义就是一个被作为参数传递的函数。 通俗地理解:我现在写一个函数,里面定义了函数A,那么函数A就是回调函数。 以前我认为JavaScript不过是一门在浏览器端执行的简单脚本语言,我只要会写会读就行了,正经写程序还是要靠C++\C#\Java等高级语言来做。看了回调函数和它的特点特别是看了一些JavaScript函数的原型才明白JavaScript虽然简单,可是这门语言设计得真是巧妙,深入掌握并不容易。 我的理解,回调函数是JavaScript的精华之一,它给JavaScript这门语言增添了很多的精巧和奥妙。 比如: 1、JavaScript作为一门编程语言本身只支持单线程,怎样支持多线程编程呢? JavaScript操作的是BOM和DOM,为了避免处理冲突,作为编程语言它本身是单线程是可以理解的,但作为宿主的浏览器是支持多线程的,那么它就可以通过回调函数在浏览器的支持下实现多线程。 比如Jquery处理鼠标单击事件的定义是:$(selector).click(function) 这里的click(function)是回调函数,同样对于鼠标的单击事件有更广泛的定义:$(selector).on(event,childSelector,data,function) 这里的function也是回调函数,意思是说,这个函数是一定要执行的,具体什么时候执行不确定,当执行到这行代码的时候,浏览器就把函数的具体实现放到执行队列去排队执行就好了,这行代码就算过去了,浏览器可以继续执行下一行的代码了。 单线程容易造成阻塞,因为必须等一行代码执行完了才能继续执行下一行代码,如果某一行代码很耗时,那么给用户的感觉就是浏览器卡顿,而有了回调函数的这一执行机制,就有效地避免了这种拥塞,给用户的感觉就是多线程的执行环境,其实是浏览器的多线程和JavaScript的回调函数执行机制联合起了作用。 2、编程的函数实现了某些功能,可是这些函数的具体实际的应用依赖于某些特定的需求,这些需求我现在不清楚,怎样让函数去契合这些需求呢? 举例来说,数组排序很简单:
var arr=[92,12,29,24]?? ?
arr=arr.sort()
console.log(arr)
执行输出为:[12, 24, 29, 92] 默认的就是从小到大的升序排序,针对包含了数字的数组。 问题是数组也可能是字符串或者是时间,又或者我想要的是从大到小的排序呢?这些都是开始无法确定的。 看sort的函数说明: method:sort(function):array 中间的参数是个(回调)函数,这为程序功能提供了更多的实现。 如果需要是降序排序:
?? ?var arr=[92,12,29,24]
?? ?function compareNumber(a,b){
?? ??? ?return b-a
?? ?}
?? ?arr=arr.sort(compareNumber)
?? ?console.log(arr)
如果是字符串数组呢?现在有四个时间的字符串,我想按照月份从小到大排序:
?? ?arr=['20000901','20080401','20211105','20180103']
?? ?function compareMonthChar(a,b){
?? ??? ?return Number(a.substr(4,2)) - Number(b.substr(4,2))
?? ?}
?? ?arr=arr.sort(compareMonthChar)
?? ?console.log(arr)
关键点还在于,回调函数作为参数只有函数名而没有参数列表,这一点的设计真是灵巧。 3、软件开发无非就是输入、处理、输出这些,有些函数实现了输入,具体的处理和输出需要未来的开发者去实现,怎样做到这一点呢? 比如在Node.js的Web应用开发中,获取了访问者的数据,他的连接和一些访问参数,怎样响应呢? 使用回调函数来衔接。 看Node.js中的函数设计:
var express = require('express')
var app = express()
app.get('/', function (req, res) {
res.send('hello world')
})
app.listen(3000)
这里的函数 function (req, res) {? res.send('hello world') }就是回调函数。
const http=require('http')
const fs=require('fs')
const path=require('path')
const server=http.createServer()
server.on('request',(req,res)=>{
? ? const url=req.url
? ? let filePath=path.join(__dirname,url)
? ? console.log(`正在请求地址:${url},实际对应地址为${filePath}`)
})
server.listen(2022,()=>{
? ? console.log('服务器正在运行,http://127.0.0.1:2022')
})
这里的(req,res)=>{}也是回调函数。
|