一、函数
在Node.js中,函数是一段可重复使用的代码,它可以接受输入(参数),执行一系列操作,并返回一个结果(返回值)。下面是一个简单的Node.js函数示例:
// 定义一个简单的函数,接受两个参数并返回它们的和
function add(a, b) {
return a + b;
}
// 调用函数并打印结果
console.log(add(5, 3)); // 输出:8
这个函数名为add
,它接受两个参数a
和b
,并返回它们的和。在调用函数时,我们传递了5和3作为参数,并将结果打印到控制台。
下面是一个更复杂的函数示例,它使用Node.js的内置模块fs
来读取文件内容,并将其作为字符串返回:
const fs = require('fs');
// 定义一个函数,接受一个文件路径作为参数,并返回文件内容
function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
// 调用函数并处理结果
readFile('example.txt')
.then((data) => {
console.log(data); // 输出文件内容
})
.catch((err) => {
console.error(err); // 输出错误信息
});
这个函数名为readFile
,它接受一个文件路径作为参数,并返回一个Promise对象。在函数内部,我们使用Node.js的fs.readFile
方法来读取文件内容,并在回调函数中根据读取结果调用resolve
或reject
方法。在调用函数时,我们使用.then()
方法处理成功的情况,使用.catch()
方法处理错误情况。
二、函数类型
在Node.js中,函数可以根据不同的分类标准分为多种类型。以下是其中一些常见的分类:
- 按调用方式分类:
- 同步函数:同步函数在执行完毕后会立即返回结果。
- 异步函数:异步函数不会立即返回结果,通常用于处理需要时间来完成的I/O操作,如读取文件、发送网络请求等。异步函数通常使用回调函数、Promise对象或async/await语法来处理结果。
- 按用途分类:
- 常用函数:如
fs.readFile
、http.createServer
等,这些函数用于执行常见的I/O操作和网络通信。 - 自定义函数:用户可以根据自己的需求定义自己的函数。
- 按参数分类:
- 无参数函数:不接受任何参数的函数。
- 单参数函数:接受一个参数的函数。
- 多参数函数:接受两个或更多参数的函数。
- 按作用域分类:
- 全局函数:在任何地方都可以调用的函数。
- 局部函数:只能在特定作用域内调用的函数。
- 按执行方式分类:
- 立即执行函数:在定义后立即执行的函数。
- 延迟执行函数:在特定时间或条件下执行的函数。
- 按返回值分类:
- 有返回值函数:执行后返回结果的函数。
- 无返回值函数:执行后不返回结果的函数,或返回null或undefined。
- 按功能分类:
- 加密函数:如
crypto.createHash
、crypto.createCipher
等,用于进行各种加密操作。 - 时间处理函数:如
Date.parse
、Date.now
等,用于处理日期和时间。 - 网络通信函数:如
net.createServer
、net.connect
等,用于创建服务器和处理网络通信。 - Websocket 函数:如
ws.createServer
、ws.connect
等,用于处理WebSocket通信。 - 文件系统(fs)操作函数:如
fs.readFile
、fs.writeFile
等,用于进行文件读写操作。 - HTTP 请求处理函数:如
http.createServer
、http.request
等,用于创建HTTP服务器和处理HTTP请求。
- 箭头函数(ES6引入):箭头函数是ES6引入的一种新的函数形式,它使用箭头语法(=>)定义,可以简化函数的书写和调用操作。箭头函数具有this绑定等特点,适用于许多场景。
以上是Node.js中常见的函数类型,但并不是全部类型。在实际使用中,可以根据具体需求选择适合的函数类型来编写代码。
三、函数案例
- 普通函数(声明式函数)
普通函数是最常见的函数类型,使用function
关键字进行声明。
function greet(name) {
console.log(`Hello, ${
name}!`);
}
greet('World'); // 输出:Hello, World!
- 匿名函数(函数表达式)
匿名函数没有函数名,通常作为变量值、回调函数或立即执行函数表达式(IIFE)使用。
// 作为变量值
const greet = function(name) {
console.log(`Hello, ${
name}!`);
};
greet('World'); // 输出:Hello, World!
// 作为回调函数
setTimeout(function() {
console.log('Hello after 2 seconds!');
}, 2000);
// 立即执行函数表达式(IIFE)
(function() {
console.log('This runs immediately!');
})();
- 箭头函数(ES6+)
箭头函数是ES6中引入的一种更简洁的函数表达方式,它没有自己的this
、arguments
、super
或new.target
。
const greet = (name) => console.log(`Hello, ${
name}!`);
greet('World'); // 输出:Hello, World!
- 异步函数(Async Functions, ES7+)
异步函数是处理异步操作(如Promise)的更直观方式,使用async
和await
关键字。
const fs = require('fs').promises;
async function readFileAsync(path) {
try {
const data = await fs.readFile(path, 'utf-8');
console.log(data);
} catch (error) {
console.error(`Error reading file from disk: ${
error}`);
}
}
readFileAsync('example.txt');
- 回调函数(Callback Functions)
回调函数作为参数传递给其他函数,并在某个时间点由该函数调用。
function greet(name, callback) {
console.log(`Hello, ${
name}!`);
callback();
}
function sayGoodbye() {
console.log('Goodbye!');
}
greet('World', sayGoodbye);
// 输出:
// Hello, World!
// Goodbye!
- Promise 相关的函数
Promise 用于异步编程,代表一个可能是现在、将来或永远都不可用的值。
const promise = new Promise((resolve, reject) => {
setTimeout(() => resolve('Promise resolved!'), 1000);
});
promise.then(result => console.log(result)).catch(error => console.error(error));
- 定时器函数
Node.js 提供了几种定时器函数,如setTimeout
、clearTimeout
、setInterval
和clearInterval
。
// 使用 setTimeout
const timeoutId = setTimeout(() => console.log('Hello after 2 seconds!'), 2000);
// 清除 setTimeout
clearTimeout(timeoutId);
// 使用 setInterval
const intervalId = setInterval(() => console.log('Hello every second!'), 1000);
// 清除 setInterval
clearInterval(intervalId);