Node.js入门教程(二十一):函数
一、函数的重要性函数是一段可重复使用的代码块用于执行特定任务。在 Node.js 中函数是 JavaScript 的核心组成部分之一是构建应用程序的基本单元。Node.js 继承了 JavaScript 的所有函数特性并在其异步编程模型中发挥了重要作用。在 JavaScript 中一个函数可以作为另一个函数的参数。我们可以先定义一个函数然后传递也可以在传递参数的地方直接定义函数。函数的重要性方面说明代码复用避免重复编写相同逻辑模块化将复杂问题分解为小函数可维护性便于调试和修改独立功能单元二、函数定义方式函数声明使用function关键字声明一个函数function greet(name) { console.log(Hello, ${name}!); }函数表达式将函数赋值给一个变量const greet function(name) { console.log(Hello, ${name}!); };箭头函数ES6 引入的简洁函数表达式const greet (name) { console.log(Hello, ${name}!); }; // 单行箭头函数可省略 return const greet name console.log(Hello, ${name}!); // 返回对象的箭头函数需要加括号 const getUser () ({ name: Alice, age: 30 });三、函数的类型1. 普通函数最常见的函数形式可以有参数和返回值function add(a, b) { return a b; }2. 匿名函数没有名字的函数通常作为参数传递给其他函数setTimeout(function() { console.log(This is an anonymous function.); }, 1000);3. 回调函数作为参数传递给另一个函数并在某个操作完成后被调用function fetchData(callback) { setTimeout(() { const data Some data; callback(data); }, 1000); } fetchData((data) { console.log(data); });四、异步函数从回调到 Promiseconst fs require(fs); function readFilePromise(path) { return new Promise((resolve, reject) { fs.readFile(path, utf8, (err, data) { if (err) reject(err); else resolve(data); }); }); }async/await使用async和await关键字处理异步操作async function fetchUser(id) { try { const response await fetch(https://api.example.com/users/${id}); const user await response.json(); return user; } catch (error) { console.error(Error fetching user:, error); } } fetchUser(1).then(user console.log(user));五、调用方式对比调用方式示例特点直接调用greet(Alice)最常见的方式作为方法调用obj.method()this指向调用对象构造函数调用new Constructor()创建新实例间接调用greet.call(null, Bob)可改变this指向六、高级用法1. 闭包闭包是指一个函数能够记住并访问其词法作用域即使这个函数在其词法作用域之外执行function createCounter() { let count 0; return function() { count; return count; }; } const counter createCounter(); console.log(counter()); // 1 console.log(counter()); // 22. 高阶函数接受函数作为参数或返回函数的函数function applyOperation(a, b, operation) { return operation(a, b); } const sum applyOperation(5, 3, (x, y) x y); const product applyOperation(5, 3, (x, y) x * y); console.log(sum); // 8 console.log(product); // 15七、函数参数处理默认参数在函数声明时为参数提供默认值function greet(name Guest) { console.log(Hello, ${name}!); } greet(); // Hello, Guest! greet(Alice); // Hello, Alice!剩余参数允许将不定数量的参数表示为一个数组function sum(...numbers) { return numbers.reduce((acc, num) acc num, 0); } console.log(sum(1, 2, 3, 4)); // 10解构参数从对象或数组中提取数据并将其赋值给变量function getUserInfo({ name, age }) { console.log(Name: ${name}, Age: ${age}); } const user { name: Alice, age: 30 }; getUserInfo(user); // Name: Alice, Age: 30八、函数作为参数传递在 Node.js 中函数可以作为参数传递给其他函数function say(word) { console.log(word); } function execute(someFunction, value) { someFunction(value); } execute(say, Hello);以上代码中我们把say函数作为execute函数的第一个变量进行了传递。这里传递的不是say的返回值而是say本身这样一来say就变成了execute中的本地变量someFunctionexecute可以通过调用someFunction()带括号的形式来使用say函数。匿名函数我们可以把一个函数作为变量传递但不一定要先定义再传递可以直接在另一个函数的括号中定义和传递function execute(someFunction, value) { someFunction(value); } execute(function(word) { console.log(word); }, Hello);我们在execute接受第一个参数的地方直接定义了我们准备传递给execute的函数。用这种方式我们甚至不用给这个函数起名字这也是为什么它被叫做匿名函数。九、函数是如何让 HTTP 服务器工作的带着这些知识再来看看简约而不简单的 HTTP 服务器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函数传递了一个匿名函数。用这样的代码也可以达到同样的目的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);十、函数最佳实践函数设计原则原则说明单一职责一个函数只做一件事合理命名使用动词名词形式如getUserInfo控制长度建议不超过 20 行代码避免副作用纯函数更易于测试和维护示例单一职责function calculateArea(width, height) { return width * height; }示例避免全局变量function calculateTotal(items) { let total 0; for (const item of items) { total item.price * item.quantity; } return total; }使用箭头函数箭头函数简洁明了特别是在处理回调函数时const users [ { id: 1, name: Alice }, { id: 2, name: Bob } ]; const names users.map(user user.name); console.log(names); // [Alice, Bob]错误处理使用try...catch语句处理可能抛出的错误async function fetchUser(id) { try { const response await fetch(https://api.example.com/users/${id}); if (!response.ok) { throw new Error(Network response was not ok); } const user await response.json(); return user; } catch (error) { console.error(Error fetching user:, error); } }十一、性能优化技巧使用闭包缓存结果记忆化function memoize(fn) { const cache new Map(); return (...args) { const key JSON.stringify(args); if (cache.has(key)) return cache.get(key); const result fn(...args); cache.set(key, result); return result; }; } // 使用 const slowFibonacci memoize(function(n) { if (n 2) return n; return slowFibonacci(n - 1) slowFibonacci(n - 2); });十二、实战练习练习 1温度转换函数/** * 实现摄氏度和华氏度互相转换 * param {number} temp - 温度值 * param {string} unit - 原始单位 (C 或 F) * returns {number} 转换后的温度 */ function convertTemperature(temp, unit) { if (unit C) { return temp * 9 / 5 32; // 摄氏转华氏 } else if (unit F) { return (temp - 32) * 5 / 9; // 华氏转摄氏 } throw new Error(Invalid unit. Use C or F.); } console.log(convertTemperature(0, C)); // 32 console.log(convertTemperature(32, F)); // 0练习 2简单的事件发射器class EventEmitter { constructor() { this.events {}; } // 注册事件监听 on(event, listener) { if (!this.events[event]) { this.events[event] []; } this.events[event].push(listener); return this; } // 触发事件 emit(event, ...args) { if (!this.events[event]) return false; this.events[event].forEach(listener { listener(...args); }); return true; } // 移除事件监听 off(event, listener) { if (!this.events[event]) return this; this.events[event] this.events[event].filter( l l ! listener ); return this; } // 一次性监听 once(event, listener) { const wrapper (...args) { listener(...args); this.off(event, wrapper); }; return this.on(event, wrapper); } } // 使用示例 const emitter new EventEmitter(); emitter.on(greet, (name) { console.log(Hello, ${name}!); }); emitter.emit(greet, Alice); // Hello, Alice!十三、本章小结知识点说明函数定义函数声明、函数表达式、箭头函数函数类型普通函数、匿名函数、回调函数异步函数Promise、async/await高级用法闭包、高阶函数参数处理默认参数、剩余参数、解构参数函数作为参数回调函数、匿名函数最佳实践单一职责、合理命名、错误处理提示函数是 JavaScript/Node.js 的核心构建块。理解函数的不同形式、调用方式和高级用法是编写高质量 Node.js 应用的基础。在实际开发中建议优先使用箭头函数处理简单的回调逻辑使用async/await处理异步操作并始终遵循单一职责原则编写函数。

相关新闻

娄底网站建设方案:中小企业如何低成本搭建高效获客官网的实战指南与深度解析

娄底网站建设方案:中小企业如何低成本搭建高效获客官网的实战指南与深度解析

本文关键词:娄底网站建设方案在这个数字化浪潮席卷每一个角落的时代,很多人可能会有这样一个错觉:似乎只有在北上广深那样的一线城市,才需要去纠结网站的建设和运营。但在我们娄底,在这个有着厚重历史底蕴和强劲制造业基础的湖南中部城市,这种观点早就过时了。如果你还在…

2026/10/19 17:01:50 阅读更多 →
SPARTA API详解:轻松掌握抽象环境与分区的实现原理

SPARTA API详解:轻松掌握抽象环境与分区的实现原理

SPARTA API详解:轻松掌握抽象环境与分区的实现原理 【免费下载链接】SPARTA SPARTA is a library of software components specially designed for building high-performance static analyzers based on the theory of Abstract Interpretation. 项目地址: https…

2026/10/20 1:41:15 阅读更多 →
零基础也能做网站?揭秘几款亲测好用的免费网站建设软件,小白必看避坑指南

零基础也能做网站?揭秘几款亲测好用的免费网站建设软件,小白必看避坑指南

最近有个读者在后台问我:“老板,我想搞个企业官网或者个人博客,但是不懂代码,也不会设计,听说找外包建站太贵了,动不动就大几千甚至上万,有没有什么办法能自己弄出来,而且最好是不要花钱的?”说实话,听到这种问题我真的特别想拍大腿。因为在我刚开始做互联网的时候,…

2026/10/20 2:46:08 阅读更多 →

最新新闻

NeuDecide:面向儿童语音交互的端到端轻量决策模型

NeuDecide:面向儿童语音交互的端到端轻量决策模型

1. 项目概述:一个被严重低估的“语音直通决策”范式转变最近在几个开源模型仓库和儿童教育硬件论坛里反复看到NeuDecide这个名字,点进去发现它不是又一个微调版 Whisper 或者 Whisper,而是一个彻底绕开传统语音识别(ASR&#xff0…

2026/10/20 18:14:48 阅读更多 →
企业大模型选型方法论:场景匹配、成本、工程与安全四维评估

企业大模型选型方法论:场景匹配、成本、工程与安全四维评估

前阵子有个做企业服务的哥们儿来找我聊,说他们准备把正在用的模型服务换掉,原因是“排行榜第一名已经换人了,我们是不是也该跟着换”。我当时就劝他先把预算和业务场景摆到桌面上,别急着追榜单。做模型选型这些年,我见…

2026/10/20 18:14:48 阅读更多 →
BC106上三角矩阵判定:从解题到工程应用的深度解析

BC106上三角矩阵判定:从解题到工程应用的深度解析

1. 从一道题看矩阵判定的门道"BC106 上三角矩阵判定"这个标题,第一次看到的人可能会觉得——不就是判断一个矩阵是不是上三角吗?有什么好讲的。但真正写过这道题、并且被它卡过的人都知道,这里面藏着不少容易翻车的地方。我第一次做…

2026/10/20 18:14:48 阅读更多 →
macOS本地AI照片视频搜索:多模型协同的隐私高效方案

macOS本地AI照片视频搜索:多模型协同的隐私高效方案

1. 这不是又一个“本地AI搜索”玩具,而是 macOS 上真正能管用的照片视频管家 你有没有过这种经历:去年夏天在海边拍的几百张照片,想找其中一张戴着草帽的合影,结果在相册里翻了二十分钟,最后靠模糊记忆点开某个日期文件…

2026/10/20 18:14:48 阅读更多 →
Archify开源项目商业化路径:从8万Star到$29/月SaaS产品

Archify开源项目商业化路径:从8万Star到$29/月SaaS产品

1. 项目概述:一个开源工具如何从代码仓库走向商业化产品“我免费开源的 Archify 约 8 万 Star,别人先做出了 $19/月的在线版”——这句话不是抱怨,而是一面镜子,照出了当代开源生态里最真实、也最容易被忽视的底层逻辑&#xff1a…

2026/10/20 18:14:48 阅读更多 →
生物医学传感器信号链设计:从换能原理到工程实践

生物医学传感器信号链设计:从换能原理到工程实践

简介:山东大学《生物医学传感器与测量》国家精品课程课件共447页,压缩包内为单个PDF文件,总大小46.57MB。课程面向生物医学工程、传感器技术相关专业学生,以及智能手环、血氧仪等可穿戴设备研发和医疗仪器应用工程师。内容从绪论入…

2026/10/20 18:13:46 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →