JavaScript(6):回调函数
在百度百科中,回调函数的定义就是一个被作为参数传递的函数。
通俗地理解:我现在写一个函数,里面定义了函数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)
关键点还在于,回调函数作为参数只有函数名而没有参数列表,这一点的设计真是灵巧。想一想C语言中的指针的灵活使用和C#中委托就理解了这个设计的意图。
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.urllet filePath=path.join(__dirname,url)console.log(`正在请求地址:${url},实际对应地址为${filePath}`)})server.listen(2022,()=>{console.log('服务器正在运行,http://127.0.0.1:2022')})
这里的(req,res)=>{}也是回调函数。
JavaScript(6):回调函数相关推荐
- 如何用JavaScript的回调函数做出承诺
by Adham El Banhawy 由Adham El Banhawy 如何用JavaScript的回调函数做出承诺 (How to make a Promise out of a Callbac ...
- 彻底理解JavaScript中回调函数 (推荐)
在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...
- ajax回调函数有时成功有时失败,javascript - Ajax 回调函数行为随机。我做错了什么?...
我有以下行为随机的 ajax 函数.有时会显示警报 success finally.在其他情况下,第二个警报是 显示 Failure: my status is 500. promptId 从调用函数 ...
- javascript之回调函数小知识
Javascript异步编程方法------"回调函数" 这是异步编程最基本的方法. 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. ...
- javascript~callback回调函数
函数是对象,所以它可以作为一个参数传递给其他函数. 回调函数作为一个参数传递给其他函数时是没有括号的,只有函数名:使用括号表示立即执行回调函数callback.我们只希望传递一个函数的引用,让其他函数 ...
- javascript的回调函数 同步 异步
后一个任务等待前一个任务结束再执行.程序执行顺序与任务排列顺序一致的,同步的. 参考: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%B ...
- javascript的回调函数
回调函数概念:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数. JS Api 里这样解释:A c ...
- 有关JavaScript中回调函数的所有内容!
作者:Shadeed 译者:前端小智 来源:dmitripavlutin 点赞再看,微信搜索**[大迁世界],B站关注[前端小智]**这个没有大厂背景,但有着一股向上积极心态人.本文 GitHub h ...
- JavaScript:回调函数(callback)
前言 callback,大家都知道是回调函数的意思.如果让你举些callback的例子,我相信你可以举出一堆.但callback的概念你知道吗?你自己在实际应用中能不能合理利用回调实现功能? 我们在平 ...
- javascript利用回调函数解决异步困扰
虽然已经存在promise,StratifiedJS等工具用来解决回调地狱,但是讲真,我觉得他们也并没有让代码的可读性大大增强,而且在回调函数的嵌套次数有限的情况下也不至于成为一个"地狱&q ...
最新文章
- opencv-学习笔记(5)形态学转变
- java常见异常说明汇总
- C#中Math的使用总结
- Android关掉多个activity,Android应用开发之Android Activity栈管理 制定关闭某一个Activity,关闭所有Activit...
- android 定制ui,AndroidSDK-UI定制
- java jvm虚拟机_Java虚拟机(JVM)简介
- 旷视周而进:人脸识别简史与距离对齐技术的应用
- linux下代码写错了怎么更改_linux系统下poll和epoll内核源代码剖析
- Verilog HDL 出租车计费器实现
- 小米高级交互设计师:产品设计的八个原则
- uni-app教程支付php,uni-app IOS app微支付、支付宝整合记录
- 2017年工作总结--初出茅庐
- 十大思想实验(思维风暴)
- opencv3.4.4 +contrib模块在win10+vs2017的编译和配置
- UI: 网易新闻实现
- Oracle分区表概述、分类、使用方法及注意事项
- VS Code按住ctrl不能跳转到定义/函数(Python)
- vmware虚拟机挂载ISO镜像并创建本地yum源
- U盘如何恢复正常存储U盘
- 政务云异构虚拟化平台迁移案例
热门文章
- 严小样儿教你做数据分析(1)——Excel做一元线性回归预测和相关系数计算
- 高mysql千万级大数据SQL查询优化几条经验
- IDEA主题设置更换
- php第三方微信app支付接口开发,PHP开发APP微信支付接口
- html input trim,javascript – jQuery:$.trim()在input.val()中的单词之间的空格
- word整个表格首行缩进_word表格怎么首行缩进 word表格内容缩进
- 【实习周报】2019年5月 前端开发实习工作周报汇总
- python批量生成excel文件_实例1:用Python自动批量生成Excel档物料标签
- matlab 计算 fdr,基因富集分析(p值,q值和FDR值)
- 第六篇:uniapp的rpx响应式px样式