回调定义刚开始学习javascript的时候,对回调函数的理解只停留在定义阶段。什么是回调函数?就是将一个函数作为参数传递给另一个函数,作为参数的函数就是回调函数。至于为什么要使用回调函数?回调函数有什么作用?那时对这些一无所知!最近学习node.js涉及到很多异步编程,很多地方都需要回调函数,所以这两天对javascript回调函数有了深刻的理解。以下是我对回调函数的理解。函数也是对象。想要了解js回调函数,首先要了解函数的规则。在javascript中,一个函数就是一个对象。准确的说,函数就是通过function()构造函数创建的函数对象,所以我们可以把函数存储在一个变量中,当然变量中存储的函数可以作为参数传递给另一个函数,也就是回调函数。例如:varcallback=function(arg3){console.log('callbackTotleis:'+arg3)}functionfn(arg1,arg2,cb){varTotal=arg1+arg2;cb(总计);安慰。log('mainFunctionTotleis:'+Total)}fn(2,2,callback)//调用fn()函数并传入2,2,callback作为参数在上面的例子中,我们给变量callback,并将callback作为参数传递给fn()函数,那么callback就是函数fn()中的回调函数。同步回调与异步回调上面代码的执行结果是:callbackTotleis:4mainFunctionTotleis:4错误!回调函数不应该在主函数结束时执行吗?是的,很多介绍回调函数的例子到这里就结束了。异步回调函数确实应该在函数的最后执行,但是上面的例子是同步回调函数,函数的执行顺序还是从上到下依次执行。那么什么是异步回调呢?我们如何实现异步回调?下面我们举两个例子来说明:例一:functionf2(){console.log('f2finished')}functionf1(cb){setTimeout(cb,1000)//使用setTimeout()模拟耗时操作控制台.log('f1完成')}f1(f2);//得到的结果是f1finished,f2finished这里我们使用setTimeout()来模拟耗时操作,前提是js中的setTimeout()函数支持异步处理,所以我们得到f1finished,f2finished例子2:varfs=require("fs");fs.readFile('input.txt','utf-8',function(err,data){if(err)returnconsole.error(err);console.log(data.toString());});console.log("程序执行结束!");程序执行的结果是:$nodeapp程序执行结束!Let'sTesttheasynchronouscallbackfunction在上面的例子中,我们首先创建了一个文件input.txt,其中包含:'Let'stesttheasynchronouscallbackfunction'如果按照同步的思路,程序应该执行fs.readFile直到文件被读取只执行下面的console.log("程序执行结束!");但是node中的fs.readFile是支持异步处理的,所以程序执行到这里的时候,不会阻塞,而是继续往回执行,当文件读取完成后,会自动调用传入的匿名回调函数,所以出现以上结果。参考文章:回调函数详解——以JS为例解读异步、回调、EventLoophttp://blog.csdn.net/tywinsta...Javascript异步编程的4种方法-阮一峰的博客http://www.ruanyifeng.com/blo…
