函数传递
function say(word) {
console.log(word);
}
function execute(someFunction,value){
someFucntion(value);
}
execute(say,"Hello");
进化......
function execute(someFunction,value){
someFunction(value);
}
execute(function(word){console.log(word)},"Hello");
这次somefunction连函数名都不需要了,是为匿名函数。
为什么我们要这样?为什么我们要向创建方法传递一个函数,而在这个方法执行时函数便会调用?
var http = require("http");;
http.createServer(function(request,response) {
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
这是Node.js服务器的一个例子,对照之前的函数,我们可以知道我们创建了一个服务器函数并侦听8888端口,而一旦有新的请求到达时,便会调用里面的function,在客户端输出“Hello World”。
打个比方,我们坐在屋子里面的沙发,沙发距离门有一段距离。当我们听到有人敲门(请求到达)时,我们从沙发站起,走到门前开门(执行响应操作)。而现在是女朋友要来你家了(你内心慌得一匹得甚至有点想撸代码),你便跑到门前候着(侦听,等待HTTP请求),女朋友一来立刻开门。
这就是基于事件驱动的回调。
那你又一想,要是我们既没等到HTTP请求,我们的函数也没有调用捏?(我们岂不是干候着?还能干啥?)
可以干。我们之后的代码还是有效。
var http = require("http");;
http.createServer(function(request,response) {
console.log("Request received.");
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
console.log("Server has started.");
客户端localhost:8888在未访问时服务端先输出Server has started.
当客户端发出HTTP请求时服务端再输出Request received,而客户端照常输出"Hello World"。
等等,为什么是两句输出Request received?
这是因为在我们访问时,服务器会尝试读取localhost:8888/favicon.ico
以上便是事件驱动的异步服务端和回调。