Like Share Discussion Bookmark Smile

J.J. Huang   2020-01-26   Node.js   瀏覽次數:

Node.js | Function(函数)

簡介

JavaScript中,一個函數可以作為另一個函數的參數。我們可以先定義一個函數,然後傳遞,也可以在傳遞參數的地方直接定義函數。

Node.js中函數的使用與Javascript類似,舉例來說,你可以這樣做:

1
2
3
4
5
6
7
8
9
function say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");

執行結果如下:

1
2
$ node main.js
Hello

以上程式中,我們把say函數作為execute函數的第一個變量進行了傳遞。這裡傳遞的不是say的返回值,而是say本身!

這樣一來,say就變成了execute中的本地變量someFunctionexecute可以通過調用someFunction()(帶括號的形式)來使用say函數。

當然,因為say有一個變量,execute在調用someFunction時可以傳遞這樣一個變量。

匿名函數

我們可以把一個函數作為變量傳遞。但是我們不一定要照這個「先定義,再傳遞」規則,我們可以直接在另一個函數的括號中定義和傳遞這個函數:

1
2
3
4
5
function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");

執行結果如下:

1
2
$ node main.js
Hello

我們在execute接受第一個參數的地方直接定義了我們準備傳遞給execute的函數。

1
2
function(word){ console.log(word) }
`

用這種方式,我們甚至不用給這個函數起名字,這也是為什麼它被叫做匿名函數 。

函數傳遞是如何讓HTTP伺服器工作的

我們再來看看我們簡約而不簡單的HTTP伺服器:

1
2
3
4
5
6
7
var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);

如上我們向createServer函數傳遞了一個匿名函數。

如下用這樣的程式也可以達到同樣的目的:

1
2
3
4
5
6
7
8
9
var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);

註:以上參考了
Node.js 函数