理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解

发布时间:2026/9/8 23:53:36

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解
理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp在 JavaScript 中函数并非必须包含return语句当函数没有显式返回任何值时调用它只会得到undefined。本文围绕 freeCodeCamp 课程 Basic JavaScript基础 JavaScript模块中的同名官方挑战Understanding Undefined Value returned from a Function展开先剖析概念与官方示例再带你通过addFive编程题完成任务并对照课程仓库中的校验逻辑与相邻章节从原理到实战彻底掌握“副作用函数 vs 返回值函数”的区别。挑战文件在课程中的定位这份挑战是 freeCodeCamp 开源课程仓库中的一份 Markdown 教学文件路径为curriculum/challenges/english/blocks/basic-javascript/598e8944f009e646fc236146.md属于Basic JavaScript基础 JavaScript学习块。该块共有数百道挑战文件都集中在curriculum/challenges/english/blocks/basic-javascript/目录下。从块的顺序配置 basic-javascript.json第 223–225 行可以看出本挑战紧跟在Global vs. Local Scope in Functions之后、Assignment with a Returned Value之前前面还经历过 Return a Value from a Function with Return第 200–201 行的铺垫。也就是说课程已经讲过“用return把值送出函数”这道题反其道而行专门训练你认识“没有return时函数返回undefined”这一 JavaScript 内置行为。文件头部 YAML front matter 记录了元信息--- id: 598e8944f009e646fc236146 title: Understanding Undefined Value returned from a Function challengeType: 1 forumTopicId: 301177 dashedName: understanding-undefined-value-returned-from-a-function ---其中id是该挑战在课程体系中的唯一标识结构文件中正是用它来排序与引用dashedName用于 URL 与目录命名challengeType: 1标识其题型为经典的“补全代码”型练习。课程仓库使用 challenge-schema.js 等 JSON Schema / Joi 规则对所有挑战文件进行结构性校验因此每一份挑战都遵循统一的# --description--、# --instructions--、# --hints--、# --seed--、# --solutions--分段格式。核心概念函数不一定非要返回一个值原文档开宗明义给出结论函数可以包含return语句但并不是必须的。当函数没有return语句时你调用它函数会执行内部代码但其返回的值是undefined。这里需要区分两件同时发生但彼此独立的事执行代码函数体里的语句照常从上到下执行副作用修改外部变量、打印日志、操作 DOM 等全部生效产生返回值由于函数体没有执行return 某个值JavaScript 引擎在函数执行完毕后会自动返回特殊值undefined。对比前面学过的有返回值的函数Return a Value from a Function with Return 中的写法是function plusThree(num) { return num 3; } const answer plusThree(5); // answer 8return num 3;既把计算结果8“交还”给调用方又立刻终止函数继续执行。而本挑战中的函数没有这一行所以调用结果永远是undefined。官方示例逐行拆解addSum原文档的示例完整如下let sum 0; function addSum(num) { sum sum num; } addSum(3);执行推演步骤执行语句sum的值函数返回值1let sum 0;0—2定义函数addSum此时不执行函数体0—3addSum(3);进入函数体num为33执行sum sum numundefined要点在于addSum修改了全局变量sum从0变成了3这是副作用但它既没有写return sum;也没有写return 3;因此当你执行console.log(addSum(3))时会打印出undefined。这里同时呼应了课程前序章节Global Scope and Functions中讲过的规则在函数内部未使用let/const/var声明而直接赋值的变量会引用全局作用域中的同名变量。这正是addSum能“隔空”改动外部sum的原因——它访问的是全局变量本身而不是本地副本。挑战任务实现一个“只做加法、不返回值”的 addFive原文档的指令# --instructions--是创建一个不带任何参数的函数addFive。这个函数把5加到sum变量上但它的返回值是undefined。需要注意指令里的两个硬性要求不带参数function addFive()调用时不需要也不接受入参返回值为undefined意味着函数体里不能写return sum;之类的语句否则返回值就不再是undefined题目将无法通过。给定的起始代码seed挑战给出如下 seed起点代码你要改动的是// Only change code below this line与// Only change code above this line之间的区域// Setup let sum 0; function addThree() { sum sum 3; } // Only change code below this line // Only change code above this line addThree(); addFive();注意最后两行在 seed 中已经调用了addThree();和addFive();前者已定义好会把sum加 3后者需要你补全定义把sum再加 5。两个函数都执行完毕后sum应等于3 5 8。测试约束hints逐条解读课程为本题内置了 4 条自动化测试它们决定了“什么样的实现算通过”。下面逐一翻译原文档中的断言1.addFive应该是一个函数assert(typeof addFive function);typeof运算符检查实体类型只有用function关键字或箭头函数赋值等真正定义了函数才会得到function。这保证你不会漏写函数定义或把它定义成普通值。2. 两个函数都运行后sum应等于8assert(sum 8);这条由执行推演保证初始sum 0→addThree()使sum 0 3 3→addFive()使sum 3 5 8。由于测试代码运行在全局作用域它可以直接读到被函数修改过的全局sum。3.addFive()的返回值应为undefinedassert(addFive() undefined);这是本挑战的“题眼”。它直接调用一次addFive()并把返回值与undefined做严格相等比较。如果函数体里写了return sum;返回8或任何return值这一条就会失败。4. 在addFive内部应当把5加到sum上assert( __helpers.removeWhiteSpace(addFive.toString()).match(/sumsum\5|sum\5/) );这条测试考察实现方式。Function.prototype.toString()会把函数源码序列化为字符串__helpers.removeWhiteSpace去掉所有空白字符后用正则匹配两种合法写法sumsum5先读后写sum5复合赋值运算符等价写法。两者都表示“把sum加上 5 后再写回”。因此下面两种函数体都能通过function addFive() { sum sum 5; }或function addFive() { sum 5; }注意假如你不小心把5写进sum例如sum 5;虽然sum最终可能不是8也会因正则匹配失败而无法通过——这正是字符串级断言约束具体写法的意义。参考答案与运行结果推演原文档官方给出的完整解答# --solutions--如下let sum 0; function addThree() { sum sum 3; } function addFive() { sum sum 5; } addThree(); addFive();代码执行过程sum 0 addThree() → 函数体执行 sum 0 3 3返回 undefined被忽略 addFive() → 函数体执行 sum 3 5 8返回 undefined被忽略 最终sum 8addThree() 与 addFive() 的返回值均为 undefined如何亲手验证在浏览器 DevTools 控制台或 Node.js 环境粘贴上述代码再追加几行即可观察到结果console.log(sum); // 8 console.log(addThree()); // undefined console.log(addFive()); // undefined由于addThree/addFive都没有returnconsole.log对它们调用的输出必然是undefined而sum作为一个被副作用修改的全局变量其值已是8。这一步验证能够帮助你直观建立“副作用 ≠ 返回值”的心智模型。相邻课程返回值的价值在于可以被赋值使用为什么课程要先讲“没有return就返回undefined”紧接着就安排Assignment with a Returned Value56533eb9ac21ba0edf2244c3.md因为undefined是“拿不到任何东西”的信号。假如你写let result addFive(); // result 变成 undefined调用方的变量只会得到undefined无法进一步参与运算。而一旦函数用return把结果交还出来就可以把它赋值给变量继续使用——这正是右侧先求值、再赋值的规则function processArg(num) { return (num 3) / 5; } let processed 0; processed processArg(7); // processed 2两相对照结论清晰场景函数是否影响外部变量调用表达式的值只有函数体语句如sum sum 5;是副作用undefined函数体含return 表达式;视代码而定return后表达式的值因此设计函数前要想清楚你的目的是要函数“做事”产生副作用还是要函数“给结果”返回并赋值。混合使用本身合法但容易引入混乱addFive挑战正是通过“故意不返回值”让你感受二者边界。总结从这份 挑战原文 可以提炼三条可复用的知识点没有return语句的函数其调用结果恒为undefined即便函数体对外部变量产生了影响修改全局/外部变量属于副作用它与“返回一个值”是两种不同的函数行为应能清晰区分在 freeCodeCamp 的这类challengeType: 1挑战中# --hints--既做类型断言、数值断言也会用Function.prototype.toString()配合正则检查函数体写法作答时应严格贴合题目措辞。掌握了“何时该用return、何时函数注定返回undefined”你就为后续的函数式组合、递归、回调等 JavaScript 进阶特性打下了扎实基础。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

电梯非侵入式改造的三大物理红线:供电、信号、通信隔离

电梯非侵入式改造的三大物理红线:供电、信号、通信隔离

2026/9/8 23:53:36

1. 为什么“非侵入式”不是一句空话,而是维保红线的物理分界线 在电梯行业干了十多年,我经手过上百台不同品牌、不同年代的电梯加装智能调度系统。最常听到的一句话是:“师傅,你们这个盒子接一下控制柜就行,不改线路&a…

5 分钟跑通 Devika:让开源 AI 工程师替你写代码

5 分钟跑通 Devika:让开源 AI 工程师替你写代码

2026/9/8 23:53:36

5 分钟跑通 Devika:让开源 AI 工程师替你写代码 【免费下载链接】devika Devika is the first open-source implementation of an Agentic Software Engineer. Initially started as an open-source alternative to Devin. 项目地址: https://gitcode.com/GitHub_…

如何一键抓取视频号、抖音等网络资源:res-downloader 完整下载指南

如何一键抓取视频号、抖音等网络资源:res-downloader 完整下载指南

2026/9/8 23:53:36

如何一键抓取视频号、抖音等网络资源:res-downloader 完整下载指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …

Android Studio学生信息管理系统源码解析:从环境搭建到功能实现

Android Studio学生信息管理系统源码解析:从环境搭建到功能实现

2026/9/9 0:33:38

简介:这套基于Android Studio开发的学生信息管理系统源码,是作者大四毕业设计的高分项目(评审分98.5分),主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要Android项目实战练习的…

VSCode Claude Code插件配置指南:从安装到中转API避坑全解析

VSCode Claude Code插件配置指南:从安装到中转API避坑全解析

2026/9/9 0:33:38

先说个实际场景:你在VSCode里装好Claude Code插件,满心期待让它帮你改代码、写测试、梳理项目结构,结果点开面板要么报401认证失败,要么提示model not found,要么直接转圈半天最后超时。这几乎是每个刚接触Claude Code…

Claude Code完整实战指南:安装配置、MCP与Skills应用全解析

Claude Code完整实战指南:安装配置、MCP与Skills应用全解析

2026/9/9 0:33:37

老早就想把Claude Code的完整用法写下来,这阵子项目里的文件整理、脚本调试、代码重构,几乎都是开着终端用Claude Code在处理。它的思路和传统的AI聊天窗口完全不同,不是一问一答就结束,而是给你一个正在干活的人:你交…

opencode实战:终端AI编程助手安装配置与进阶玩法

opencode实战:终端AI编程助手安装配置与进阶玩法

2026/9/9 0:33:37

我前段时间被一个项目折腾得不轻:团队散落在三个时区,代码仓库老得没人敢重构,新来的同事光看项目文档就要看两天。后来朋友甩给我一个终端工具 opencode,说我试试用它"接手旧项目"。我本来没抱希望,结果它一…

MATLAB仿真2ASK、2FSK、2PSK调制解调原理与代码详解

MATLAB仿真2ASK、2FSK、2PSK调制解调原理与代码详解

2026/9/9 0:33:37

简介:二进制幅度键控(2ASK)、频移键控(2FSK)和相移键控(2PSK)是数字通信中最基础的三种调制方式,也是通信原理课程的核心仿真内容。这份MATLAB项目面向通信工程、电子信息类本科生及…

沙迪克操作面板详解:从按键布局到坐标设定与菜单逻辑

沙迪克操作面板详解:从按键布局到坐标设定与菜单逻辑

2026/9/9 0:23:37

简介:这份资源是SODICK(沙迪克)数控电火花机床操作面板模拟软件的RAR压缩包,面向模具制造及精密加工领域的学习者、培训学员和编程人员,用于在普通PC上体验与实体机床一致的控制界面与操作流程。压缩包共2000个文件&am…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/8 22:37:26

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

2026/9/9 0:03:36

简介:面向毕业设计场景的PyQt5扩散模型图像恢复项目,提供完整Python源码与项目说明,适合图像处理、深度学习方向的高年级本科生与研究生参考。项目在模块设计上覆盖图像处理、扩散模型、参数配置、用户界面与结果评估五部分,具体涉…

开关电源环路裕量测试实战:相位裕量与增益裕量详解

开关电源环路裕量测试实战:相位裕量与增益裕量详解

2026/9/9 0:03:36

1. 项目概述:为什么环路裕量测试是电子工程师绕不开的“体检项目”“从零开始的电子工程师生活(6)——环路裕量测试”,这个标题一出来,老电源工程师可能已经下意识摸了摸示波器探头,新同事则大概率在想&…

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

2026/9/9 0:03:36

拆开市面上不同价位的定时插座,你会发现一个有意思的现象:有的里面躺着一颗黑色的软封装芯片,丝印都看不清;有的则是一块小小的蓝色或绿色PCB,上面赫然印着STM8或者STC的字样。同样叫"定时插座",…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…