关于js的回调函数,同步回调与异步回调
回调定义
刚开始学习javascript时,对回调函数的理解仅仅停留在知道定义阶段。什么是回调函数? 就是将一个函数作为参数传递给另一个函数,作为参数的这个函数就是回调函数。 至于为什么要用到回调函数?回调函数有什么作用? 当时对这些一无所知! 最近学习node.js涉及到了大量的异步编程,很多地方都需要用到回调函数,所以这两天深入了解了JavaScript的回调函数,下面是我对回调函数的理解。
函数也是对象
想要弄明白js回调函数,首先要清楚函数的规则,在javascript中函数是一个对象,准确的来说函数是用function()构造函数创建的一个function对象,因此我们可以将函数存储在变量中,当然也就可以将存储在变量中的函数作为一个参数传递给另一个函数,这就是回调函数。
举个例子:
var callback = function(arg3) {console.log('callback Totle is:' + arg3)}function fn(arg1, arg2, cb) {var Total = arg1 + arg2;cb(Total);console.log('mainFunction Totle is:' + Total)
}fn(2, 2, callback) // 调用fn()函数,并传入2, 2, callback作为参数
上面例子中我们将一个匿名函数赋值给变量callback,同时将callback作为参数传递给了fn()函数,这时在函数fn()中callback就是回调函数。
同步回调和异步回调
上面的代码执行结果为:
callback Totle is:4
mainFunction Totle is:4
不对啊! 回调函数不是应该在主函数的最后执行吗?
对,很多介绍回调函数的例子讲到这里是就完了,异步回调函数的确是应该在函数的最后执行,不过上面的例子是一个同步回调函数,函数的执行顺序依然自上而下顺序执行。 那么什么是异步回调呢? 我们又怎么实现异步回调呢? 下面我们举两个例子来说明:
示例1:
function f2() {console.log('f2 finished')
}function f1(cb) {setTimeout(cb,1000) //用setTimeout()模拟耗时操作console.log('f1 finished')
}f1(f2); //得到的结果是 f1 finished ,f2 finished
这里我们用setTimeout()来模拟耗时操作的前提是js中的setTimeout()函数支持异步处理,所以我们得到的结果是 f1 finished ,f2 finished
示例2:
var fs = require("fs");fs.readFile('input.txt','utf-8', function (err, data) {if (err) return console.error(err);console.log(data.toString());
});console.log("程序执行结束!");
程序执行的结果是:
$ node app
程序执行结束!
我们来测试一下异步回调函数
上面例子中我们先创建了一个文件input.txt,里面的内容是:‘我们来测试一下异步回调函数’
如果按照同步的思维,程序应该执行fs.readFile,直到文件读完之后才执行后面的console.log(“程序执行结束!”); 然而node中的fs.readFile是支持异步处理的,因此程序执行到这儿的时候并不会阻塞,而是继续向后执行,当文件读取完毕之后再自动调用传入的匿名回调函数,因此出现了上面的结果。
原文链接
关于js的回调函数,同步回调与异步回调相关推荐
- WPF如何获得变量异步回调函数时产生的异步回调
有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数.数据库中查询诸如异步函数来获得一DataTable.怎样传递给回调函数呢? [方案一]使用全局变量 非常easy想到的是用全局变 ...
- 什么是回调函数?为什么要使用回调函数?如何使用回调函数?
1. 什么是回调函数: 函数指针的调用,即是一个通过函数指针调用的函数: 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数. In compu ...
- php回调函数的作用域,PHP将回调函数作用到给定数组单元的方法
PHP将回调函数作用到给定数组单元的方法 数组是PHP程序设计中十分重要的一环.本文介绍PHP中数组函数array_map()的用法,实现将回调函数作用到给定数组单元上.具体如下: array arr ...
- javascript的回调函数 同步 异步
后一个任务等待前一个任务结束再执行.程序执行顺序与任务排列顺序一致的,同步的. 参考: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%B ...
- 回调函数 同步回调 异步回调
回调函数 回调函数一般是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此时有两种 ...
- ajax 成功回调函数,jQuery的阿贾克斯成功回调函数定义jQuery的阿贾克斯成功回调函数定义(jQuery ajax...
我想使用jQuery的ajax从服务器获取数据. 我希望把成功的回调函数定义外面.ajax()块像下面这样. 所以,我需要声明变量dataFromServer像下面这样我就能从成功回调使用返回的数据? ...
- python回调函数实例详解_Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- reactjs组件实例三大属性之refs使用示例:字符串形式的ref、回调函数形式的ref、回调ref中回调执行次数的问题
1_字符串形式的ref <!DOCTYPE html> <html lang="en"> <head><meta charset=&quo ...
- java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...
暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...
- php回调函数如何执行顺序,PHP回调函数调用方式
//PHP回调函数调用方式 // 类MyClass class MyClass { //静态方法 public static function myCallbackMethod() { echo &q ...
最新文章
- VC6安装错误——Error Launching ......acmboot.exe
- Linux 下 svn 的使用
- SAPPHIRE NOW阿里云 - 国内传播
- python写cadance skill_《Cadence 16.6电路设计与仿真从入门到精通》——2.4 Design Entry CIS原理图图形界面...
- Windows10 下搭建汇编语言开发环境( 利用 DOSBOX 和 MASM32 )
- 苹果cmsv10自适应卡通动漫番剧模板
- js 箭头函数没有 constructor,不能被new
- leetcode - 1021. 删除最外层的括号
- 数字信号处理实验三用fft对信号作频谱分析_矢量信号分析
- 常见的监控项目组网方案技术系统图,一文了解清楚!
- BWA关于Unmatched SAI magic. Please re-run `aln' with the same version of bwa.
- K8S-Cluster部署
- c语言入门自学课件ppt,C语言入门教程ppt(434页)免费版[精品课件]
- 2021 上半年软考软件设计师真题完整版
- 详谈 import 路径
- 案例分析:股票涨跌预测
- 用代码关闭冰刃(IceSword)
- 使用自然语言处理来检测电子邮件中的垃圾邮件
- 儒略历--Java代码(附带发现了一些问题)
- ccnp需要什么学历_CCNP的完整形式是什么?