函数:编程中的核心概念
什么是函数函数是编程语言中的基本构建块它是一段可重复使用的代码块用于执行特定任务。函数通过接收输入参数、执行一系列操作然后返回输出返回值来工作。函数的基本结构大多数编程语言中函数都包含以下几个关键部分函数名用于标识和调用函数的名称参数列表函数接收的输入值函数体包含实际执行逻辑的代码块返回值函数执行后返回的结果函数的优势代码复用避免重复编写相同代码模块化将复杂问题分解为小任务可维护性修改只需在一处进行可读性通过函数名表达意图使代码更易理解函数类型示例1. 无参数无返回值函数function greet() { console.log(Hello, World!); }这类函数通常用于执行简单的操作如打印日志、初始化配置等。2. 带参数函数def add_numbers(a, b): return a b参数可以是任意类型包括基本类型、对象、数组等。函数可以接收多个参数参数之间用逗号分隔。3. 带默认参数函数function multiply(x, y 2) { return x * y; }默认参数在调用时可以不传递使用预设值。这在提供可选配置时非常有用。4. 匿名函数箭头函数const square (x) x * x;箭头函数是ES6引入的语法糖具有更简洁的语法和不同的this绑定行为。5. 高阶函数// 接收函数作为参数 function operateOnArray(arr, operation) { return arr.map(operation); } // 返回函数作为结果 function createMultiplier(factor) { return function(x) { return x * factor; }; } const double createMultiplier(2); console.log(double(5)); // 输出: 10高阶函数可以接收函数作为参数或返回函数作为结果是函数式编程的核心概念。6. 递归函数function factorial(n) { if (n 1) return 1; return n * factorial(n - 1); } console.log(factorial(5)); // 输出: 120递归函数调用自身来解决问题适用于树形结构遍历、分治算法等场景。7. 异步函数// 使用async/await async function fetchData(url) { try { const response await fetch(url); const data await response.json(); return data; } catch (error) { console.error(获取数据失败:, error); throw error; } } // 使用Promise function loadImage(src) { return new Promise((resolve, reject) { const img new Image(); img.onload () resolve(img); img.onerror reject; img.src src; }); }异步函数用于处理需要等待的操作如网络请求、文件读写等。函数参数详解参数传递方式值传递传递参数的副本函数内修改不影响原值引用传递传递对象的引用函数内修改会影响原对象默认参数为参数提供默认值调用时可省略剩余参数使用...语法接收多个参数参数解构// 对象解构 function printUser({name, age, email}) { console.log(姓名: ${name}, 年龄: ${age}, 邮箱: ${email}); } // 数组解构 function getFirstAndLast([first, ...rest]) { return {first, last: rest[rest.length - 1]}; } const user {name: 张三, age: 25, email: zhangsanexample.com}; printUser(user);参数验证function calculateArea(width, height) { // 类型检查 if (typeof width ! number || typeof height ! number) { throw new TypeError(宽度和高度必须是数字); } // 范围检查 if (width 0 || height 0) { throw new RangeError(宽度和高度必须大于0); } return width * height; }函数调用方式函数定义后需要通过调用来执行// 定义函数 function calculateArea(radius) { return Math.PI * radius * radius; } // 调用函数 let area calculateArea(5); console.log(圆的面积是 area);函数作用域与闭包作用域类型全局作用域在函数外部声明的变量函数作用域在函数内部声明的变量块级作用域使用let和const在代码块中声明的变量作用域链let globalVar 全局变量; function outer() { let outerVar 外部变量; function inner() { let innerVar 内部变量; console.log(innerVar); // 内部变量 console.log(outerVar); // 外部变量 console.log(globalVar); // 全局变量 } inner(); } outer();闭包示例// 创建计数器 function createCounter() { let count 0; return { increment: function() { count; return count; }, decrement: function() { count--; return count; }, getCount: function() { return count; } }; } const counter createCounter(); console.log(counter.increment()); // 1 console.log(counter.increment()); // 2 console.log(counter.getCount()); // 2闭包的实际应用数据封装创建私有变量函数工厂生成具有特定配置的函数模块模式实现模块化代码组织事件处理保持事件处理函数的上下文实际应用场景数据处理格式化、验证、转换数据业务逻辑实现具体的业务规则工具函数提供通用功能如日期处理、字符串操作事件处理响应用户交互算法实现排序、搜索等算法封装常见错误与调试技巧常见函数错误未定义函数调用未声明的函数参数类型错误传递错误类型的参数返回值错误忘记返回结果或返回错误类型作用域问题变量访问超出作用域递归栈溢出递归没有正确的终止条件异步回调地狱多层嵌套的异步回调调试技巧function complexCalculation(data) { // 1. 使用console.log调试 console.log(输入数据:, data); // 2. 使用debugger语句 // debugger; // 3. 添加参数验证 if (!Array.isArray(data)) { console.error(数据必须是数组); return null; } // 4. 分步计算便于调试 const step1 data.map(x x * 2); console.log(第一步结果:, step1); const step2 step1.filter(x x 10); console.log(第二步结果:, step2); const result step2.reduce((sum, x) sum x, 0); console.log(最终结果:, result); return result; } // 5. 使用try-catch处理异常 try { const result complexCalculation([1, 2, 3, 4, 5]); console.log(计算结果:, result); } catch (error) { console.error(计算失败:, error); // 记录错误信息 console.error(错误堆栈:, error.stack); }性能优化建议避免重复计算使用缓存记忆化减少函数调用批量处理数据使用尾递归优化递归性能合理使用闭包避免内存泄漏异步优化使用Promise.all并行处理最佳实践建议单一职责每个函数只做一件事明确命名函数名应清晰表达其功能控制参数数量参数不宜过多建议不超过3-5个避免副作用纯函数更易于测试和理解适当注释复杂函数应添加必要注释总结与进阶学习核心要点回顾函数是编程的基本构建块用于封装可重用的代码逻辑良好的函数设计遵循单一职责原则具有明确的输入输出理解作用域和闭包是掌握高级函数用法的关键异步函数和Promise是现代JavaScript编程的核心函数式编程强调纯函数和高阶函数的使用进阶学习方向函数式编程纯函数与副作用不可变数据函数组合与管道柯里化与部分应用设计模式中的函数工厂函数模式策略模式观察者模式装饰器模式性能优化函数节流与防抖懒加载函数Web Worker中的函数使用测试与文档单元测试编写JSDoc文档注释类型定义TypeScript实践建议要真正掌握函数建议从简单的工具函数开始练习阅读优秀开源项目的函数实现尝试重构自己的代码提取可复用的函数学习使用函数式编程库如Lodash、Ramda参与代码审查学习他人的函数设计思路函数是编程语言中最强大的工具之一。通过不断实践和学习你将能够编写出更加优雅、高效和可维护的代码。记住好的函数就像好的工具它们让复杂问题变得简单让重复工作变得轻松。

相关新闻

453张实拍车牌图+标注框+训练缓存+识别Notebook+Web演示一键跑通

453张实拍车牌图+标注框+训练缓存+识别Notebook+Web演示一键跑通

本文还有配套的精品资源,点击获取 简介:直接可用的车牌检测训练素材,含453张真实道路场景下的JPEG汽车图像,每张都带精确车牌边界框标注;train/test文件夹已划分好,附带.cache缓存文件加快数据加载&…

2026/10/19 15:20:50 阅读更多 →
OpenClaw Harness回退(Harness Fallback)完整详解

OpenClaw Harness回退(Harness Fallback)完整详解

一、核心定义与两大回退维度区分 基础前置 Harness分为两类: 专用外部Harness:codex-harness、claude-cli-harness,依赖独立外部服务/CLI进程,存在离线、崩溃、鉴权失败风险;内置标准Harness:builtin-openc…

2026/10/18 3:05:13 阅读更多 →
【单片机毕业设计】基于 STM32 的室内瓦斯温感智能监测报警系统设计与实现,基于 51 单片机的居家燃气人体感应联动预警装置开发(015602)

【单片机毕业设计】基于 STM32 的室内瓦斯温感智能监测报警系统设计与实现,基于 51 单片机的居家燃气人体感应联动预警装置开发(015602)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能一、基础采集功能二、本地联动核心报警功能三、远程辅助告警功能技术路线项目演示关于我们项目案例源码获取博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业&#x1f6…

2026/10/19 4:01:19 阅读更多 →

最新新闻

artcraft类创作工具技术架构与交互设计实战指南

artcraft类创作工具技术架构与交互设计实战指南

1. 从"artcraft"这个名字说起:一个被低估的创作工具定位问题第一次看到"artcraft"这个词,我脑子里蹦出来的第一反应是"艺术"加"手艺"的组合。这不是一个随便拼出来的名字,它暗示了一种很具体的产品气…

2026/10/20 6:27:33 阅读更多 →
从自由发挥到受控执行:大模型Skill机制实战

从自由发挥到受控执行:大模型Skill机制实战

1. 先弄明白:Skill到底解决的是什么问题1.1 大模型能力的边界在哪里如果你用过几款主流的大模型对话工具,就会发现一个奇怪的现象:让模型帮你"解释一段代码""写个正则表达式"很容易,但让它"按团队规范自…

2026/10/20 6:27:33 阅读更多 →
JavaFX+SSM架构实战:桌面客户端与数据服务端的高效整合

JavaFX+SSM架构实战:桌面客户端与数据服务端的高效整合

简介:这是一份融合 JavaFX 与 SSM 框架的 ERP 系统完整项目,面向需要将桌面 GUI 与企业级后端整合开发的 Java 学习者、毕业设计或项目实战人群,既能学习界面设计,也能掌握经典后端框架的落地方式。资源共包含 2 个文件&#xff1…

2026/10/20 6:27:33 阅读更多 →
Python与API文本分析实战:从文本清洗到工程化部署

Python与API文本分析实战:从文本清洗到工程化部署

AI应用的潜力,有一大半藏在文本里。文本分析这个方向,我自己前前后后折腾过不少方案,从早期的正则规则、词频统计,到开源模型微调,再到现在用 Python 接各类大模型 API 做文本分析,最大的感受是&#xff1a…

2026/10/20 6:27:33 阅读更多 →
IPv4报文头部详解:字段、分片与网络排查核心知识

IPv4报文头部详解:字段、分片与网络排查核心知识

做网络排查做得久了,你会发现一个特别有意思的现象:很多人能把TCP的三次握手、四次挥手讲得天花乱坠,可一旦你把抓包工具里的一帧数据展开,让他逐字节解释一下IPv4头部,他反而会卡壳。TCP、UDP这些传输层协议太出名&am…

2026/10/20 6:27:33 阅读更多 →
STM32 bxCAN实战:从物理层到过滤器配置与调试排障

STM32 bxCAN实战:从物理层到过滤器配置与调试排障

做嵌入式这几年,UART、I2C、SPI都是老朋友,但真正让我觉得“像个通信工程师”的,是开始啃STM32的CAN外设之后。原因很简单:在汽车、机器人和工业现场,CAN总线是默认的“老大哥”,而它在微控制器上的硬件实现…

2026/10/20 6:26:33 阅读更多 →

日新闻

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/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →