当前位置: 首页 > article >正文

JavaScript 的“积木”:函数入门与实践

引言:告别重复,拥抱模块化

想象一下,你在写代码时发现,有几段逻辑几乎一模一样,需要在不同的地方反复使用。你是选择每次都复制粘贴,还是希望能像搭积木一样,把这段逻辑封装起来,需要时直接调用?

函数,就是 JavaScript 提供给我们的这种强大的“积木”。它允许我们将一系列相关的语句组合在一起,形成一个独立的功能单元,并给它起一个名字。当你需要执行这个功能时,只需要“喊一声”它的名字(调用函数),代码就会自动执行。

使用函数带来的好处显而易见:

  • 代码复用 (Reusability): 同一段逻辑只需编写一次,可以在任意地方多次调用。
  • 模块化 (Modularity): 将复杂的程序分解成一个个小的、功能独立的函数,使代码结构更清晰。
  • 可维护性 (Maintainability): 修改或修复某个功能时,只需要找到对应的函数进行修改,而不用在整个代码库中到处查找和替换。
  • 可读性 (Readability): 有意义的函数名能清晰地表达该段代码的作用,让代码更容易理解。

准备好学习如何创建和使用你自己的 JavaScript “积木”了吗?

一、什么是函数?

简单来说,函数是一段可以被重复调用(执行)的代码块。它通常会接收一些输入(称为参数),执行特定的任务,并可能返回一个输出(称为返回值)。

就像一个榨汁机:你放入水果(输入/参数),它执行榨汁的操作(任务),最后得到果汁(输出/返回值)。

二、定义函数:创建你的“积木”

在 JavaScript 中,主要有以下几种定义函数的方式:

1. 函数声明 (Function Declaration)

这是最常见的方式,使用 function​ 关键字,后面跟着函数名、一对圆括号 ()​(里面可以放参数列表),以及一对大括号 {}​ 包裹的函数体(包含要执行的代码)。

// 定义一个名为 greet 的函数
function greet() {console.log("Hello there!");
}// 定义一个名为 add 的函数,它接收两个参数 a 和 b
function add(a, b) {let sum = a + b;console.log("The sum is: " + sum);
}
  • 特点: 函数声明会被提升 (Hoisted)。这意味着你可以在声明函数的代码之前调用它,JavaScript 引擎会“看到”整个脚本中的函数声明。

2. 函数表达式 (Function Expression)

这种方式是将一个匿名函数(没有名字的函数)赋值给一个变量。这个变量就成了引用该函数的名字。

// 将一个匿名函数赋值给变量 sayHi
const sayHi = function() {console.log("Hi!");
};// 将一个接收参数的匿名函数赋值给变量 multiply
const multiply = function(x, y) {let product = x * y;console.log("The product is: " + product);
};
  • 特点: 函数表达式不会被整体提升。虽然变量声明(const sayHi​)会被提升,但赋值操作(= function()...​)不会。所以,你必须在函数表达式定义之后才能调用它。

3. 箭头函数 (Arrow Functions) (ES6 新增)

这是 ES6 引入的一种更简洁的函数定义语法,尤其适用于简单的函数或回调函数。

// 一个简单的箭头函数
const wave = () => {console.log("Waving!");
};// 接收参数的箭头函数
const subtract = (a, b) => {let difference = a - b;console.log("The difference is: " + difference);
};// 如果函数体只有一条返回语句,可以省略大括号和 return 关键字
const square = x => x * x; // 等价于: const square = (x) => { return x * x; };// 如果只有一个参数,圆括号也可以省略
  • 特点: 语法更短。它还有一些重要的特性,比如不绑定自己的 this​ 值(我们将在后续深入 this​ 时详细讨论)。对于初学者,可以先掌握它的基本语法。

选择哪种方式?

  • 函数声明是最传统和常见的方式。
  • 函数表达式有时用于特定的模式,如需要根据条件定义函数。
  • 箭头函数因其简洁性在现代 JavaScript 中非常流行,尤其是在处理回调和简单功能时。

初学者可以先熟练掌握函数声明和函数表达式。

三、调用函数:使用你的“积木”

定义好函数后,它并不会自动执行。你需要通过函数名后面跟一对圆括号 ()​ 来调用 (Call / Invoke / Execute) 它。

// --- 定义函数 ---
function showMessage() {console.log("This is a message.");
}const calculateArea = function(width, height) {let area = width * height;console.log("Area:", area);
};const printName = name => console.log("Name:", name);// --- 调用函数 ---
showMessage(); // 输出: This is a message.calculateArea(10, 5); // 输出: Area: 50printName("Alice"); // 输出: Name: Alice

四、参数与参数 (Parameters & Arguments):给函数传递信息

函数可以接收外部传入的数据,以便更灵活地执行任务。

  • 参数 (Parameters): 定义函数时,在圆括号 ()​ 里声明的变量名,它们是函数内部用来接收输入值的占位符。
  • 参数 (Arguments): 调用函数时,在圆括号 ()​ 里传递的实际值。这些值会按顺序赋给函数定义中的参数。
// 定义函数,`name` 和 `age` 是参数 (Parameters)
function displayUserInfo(name, age) {console.log(`User: ${name}, Age: ${age}`);
}// 调用函数,"Bob" 和 30 是参数 (Arguments)
displayUserInfo("Bob", 30); // 输出: User: Bob, Age: 30// 可以传递变量作为参数
let userName = "Charlie";
let userAge = 25;
displayUserInfo(userName, userAge); // 输出: User: Charlie, Age: 25// 如果传递的参数数量与定义的参数数量不匹配:
displayUserInfo("David"); // 输出: User: David, Age: undefined (age 没有接收到值,是 undefined)
displayUserInfo("Eve", 22, "extra argument"); // 输出: User: Eve, Age: 22 (多余的参数会被忽略)

默认参数 (Default Parameters) (ES6):
你可以为函数的参数指定默认值。如果在调用函数时没有为该参数提供值(或提供了 undefined​),则会使用默认值。

function greetUser(name = "Guest") { // 如果不传 name,默认为 "Guest"console.log(`Hello, ${name}!`);
}greetUser("Frank"); // 输出: Hello, Frank!
greetUser();       // 输出: Hello, Guest!

五、返回值 (Return Value):从函数获取结果

函数不仅可以执行操作,还可以通过 return​ 语句将计算结果或某个值返回给调用它的地方。

  • ​return​ 语句:

    • 立即结束当前函数的执行。
    • 将 return​ 后面的表达式的值作为函数的返回值,发送回调用处。
    • 如果省略 return​ 语句,或者 return​ 后面没有跟任何值,函数会默认返回 undefined​。
// 定义一个计算圆面积并返回结果的函数
function calculateCircleArea(radius) {if (radius < 0) {console.error("Radius cannot be negative!");return; // 如果半径为负,直接返回 undefined,不再往下执行}let area = Math.PI * radius * radius;return area; // 返回计算得到的面积
}// 调用函数,并将返回值存储在变量中
let circleArea = calculateCircleArea(5);
if (circleArea !== undefined) {console.log(`The area is: ${circleArea.toFixed(2)}`); // 输出: The area is: 78.54
}let invalidArea = calculateCircleArea(-2);
console.log("Invalid area result:", invalidArea); // 输出: Invalid area result: undefined// 没有 return 语句的函数
function logSomething() {console.log("Logging...");// 没有 return
}
let result = logSomething();
console.log("Result of logSomething:", result); // 输出: Result of logSomething: undefined

返回值使得函数可以参与到更复杂的表达式和计算中。

六、函数作用域初探 (Function Scope)

一个重要的概念是:在函数内部使用 let​ 或 const​ (以及旧的 var​) 声明的变量,通常只在该函数内部可见和可用。它们被称为局部变量 (Local Variables)。

function testScope() {let localVar = "I am local";console.log(localVar); // 在函数内部可以访问
}testScope(); // 输出: I am local// console.log(localVar); // 在函数外部访问会报错: Uncaught ReferenceError: localVar is not defined

这有助于保持函数内部状态的独立性,避免与外部代码产生命名冲突。我们将在后续深入探讨作用域和闭包。

相关文章:

JavaScript 的“积木”:函数入门与实践

引言&#xff1a;告别重复&#xff0c;拥抱模块化 想象一下&#xff0c;你在写代码时发现&#xff0c;有几段逻辑几乎一模一样&#xff0c;需要在不同的地方反复使用。你是选择每次都复制粘贴&#xff0c;还是希望能像搭积木一样&#xff0c;把这段逻辑封装起来&#xff0c;需…...

从入门到精通【MySQL】视图与用户权限管理

文章目录 &#x1f4d5;1. 视图✏️1.1 视图的基本概念✏️1.2 试图的基本操作&#x1f516;1.2.1 创建视图&#x1f516;1.2.2 使用视图&#x1f516;1.2.3 修改数据&#x1f516;1.2.4 删除视图 ✏️1.3 视图的优点 &#x1f4d5;2. 用户与权限管理✏️2.1 用户&#x1f516;…...

C++中的next_permutation全排列函数

目录 什么是全排列用法实现原理自定义比较函数 注意事项相关题目1.AB Problem2.P1088 火星人 什么是全排列 全排列是指从一组元素中按照一定顺序(按字典序排列&#xff09;取出所有元素进行排列的所有可能情况。 例如&#xff0c;对于集合{1,2,3}&#xff0c;它的全排列包括&a…...

修改el-select背景颜色

修改el-select背景颜色 /* 修改el-select样式--直接覆盖默认样式&#xff08;推荐&#xff09; */ ::v-deep .el-select .el-input__inner {background-color: #1d2b72 !important; /* 修改输入框背景色 */color: #fff; } ::v-deep .el-select .el-input__wrapper {background-…...

dockercompose文件仓库

mysql version: 3 # 使用docker-compose的版本&#xff0c;根据需要可以调整# 创建数据目录 # mkdir -p /home/docker/mysql/mysql_data # mkdir -p /home/docker/mysql/mysql_logs # 给予适当的权限&#xff08;确保MySQL容器可以读写这些目录&#xff09; # chmod 777 /ho…...

【C++入门:类和对象】[3]

C入门:类和对象 拷贝构造(拷贝初始化) 拷贝构造是构造函数的重载 class Date { public:Date(int year1,int month1,int day1) { _yearyear; _monthmonth; _dayday; } Date(const Date& d)//(拷贝构造,把d1传参给d)引用传参不改变使用const //注意使用&,不然会无穷递…...

【mdlib】0 全面介绍 mdlib - Rust 实现的 Markdown 工具集

mdlib 是由开发者 bahdotsh 创建的一个多功能 Markdown 工具集合&#xff0c;包含两个主要组件&#xff1a;一个轻量级 Markdown 解析库和一个功能完善的个人 Wiki 系统。该项目完全采用 Rust 实现&#xff0c;兼具高性能与跨平台特性。 核心组件 Markdown 解析库 特性&#…...

今日CSS学习浮动->定位

------------------------------------------------------------------------------------------------------- CSS的浮动 float 属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 float 属性定义元素在哪个方向浮…...

如何实现Spring Boot应用程序的安全性:全面指南

在现代 Web 开发中&#xff0c;安全性是 Spring Boot 应用程序的核心需求&#xff0c;尤其是在微服务、云原生和公开 API 场景中。Spring Boot 结合 Spring Security 提供了一套强大的工具&#xff0c;用于保护应用程序免受常见威胁&#xff0c;如未经授权的访问、数据泄露、跨…...

YOLOv8融合CPA-Enhancer【提高恶略天气的退化图像检测】

1.CPA介绍 CPA-Enhancer通过链式思考提示机制实现了对未知退化条件下图像的自适应增强&#xff0c;显著提升了物体检测性能。其插件式设计便于集成到现有检测框架中&#xff0c;并在物体检测及其他视觉任务中设立了新的性能标准&#xff0c;展现了广泛的应用潜力。 关于CPA-E…...

Python 项目环境配置与 Vanna 安装避坑指南 (PyCharm + venv)

在进行 Python 项目开发时&#xff0c;一个干净、隔离且配置正确的开发环境至关重要。尤其是在使用像 PyCharm 这样的集成开发环境 (IDE) 时&#xff0c;正确理解和配置虚拟环境 (Virtual Environment) 是避免许多常见问题的关键。本文结合之前安装 Vanna 库时遇到的问题&#…...

第52讲:农业AI + 区块链——迈向可信、智能、透明的未来农业

目录 一、为什么农业需要“AI+区块链”? 二、核心应用场景解读 1. 农产品溯源系统 2. 农业信贷与保险精准评估 3. 农业碳足迹追踪与碳汇交易 三、案例实战分享:智能溯源 + 区块链合约 四、面临挑战与展望 五、总结 在数字农业时代,“AI” 和 “区块链” 是两股不容忽…...

模板偏特化 (Partial Specialization)

C 模板偏特化 (Partial Specialization) 模板偏特化允许为模板的部分参数或特定类型模式提供定制实现&#xff0c;是 静态多态&#xff08;Static Polymorphism&#xff09; 的核心机制之一。以下通过代码示例和底层原理&#xff0c;全面解析模板偏特化的实现规则、匹配优先级…...

【防火墙 pfsense】1简介

&#xff08;1&#xff09; pfSense 有以下可能的用途&#xff1a; 边界防火墙 路由器 交换机 无线路由器 / 无线接入点 &#xff08;2&#xff09;边界防火墙 ->要充当边界防火墙&#xff0c;pfSense 系统至少需要两个接口&#xff1a;一个广域网&#xff08;WAN&#xff0…...

Qt UDP组播实现与调试指南

在Qt中使用UDP组播(Multicast)可以实现高效的一对多网络通信。以下是关键步骤和示例代码: 一、UDP组播核心机制 组播地址:使用D类地址(224.0.0.0 - 239.255.255.255)TTL设置:控制数据包传播范围(默认1,同一网段)网络接口:指定发送/接收的物理接口二、发送端实现 /…...

线上助农产品商城小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的线上助农产品商城小程序源码&#xff0c;旨在为农产品销售搭建一个高效、便捷的线上平台&#xff0c;助力乡村振兴。 一、技术架构 该小程序源码采用了ThinkPHP作为后端框架&#xff0c;FastAdmin作为快速开发框架&#xff0c;UniApp作为跨…...

【maven-7.1】POM文件中的属性管理:提升构建灵活性与可维护性

在Maven项目中&#xff0c;POM (Project Object Model) 文件是核心配置文件&#xff0c;而属性管理则是POM中一个强大但常被低估的特性。良好的属性管理可以显著提升项目的可维护性、减少重复配置&#xff0c;并使构建过程更加灵活。本文将深入探讨Maven中的属性管理机制。 1.…...

基于Matlab的车牌识别系统

1.程序简介 本模型基于MATLAB,通过编程创建GUI界面&#xff0c;基于Matlab的数字图像处理&#xff0c;对静止的车牌图像进行分割并识别&#xff0c;通过编写matlab程序对图像进行灰度处理、二值化、腐蚀膨胀和边缘化处理等&#xff0c;并定位车牌的文字&#xff0c;实现字符的…...

three.js精灵及精灵材质、Shader源码分析

在Three.js中,Sprite(精灵)用于创建始终面向相机的2D元素,适用于标签、图标或粒子效果。本文将分析其源码及Shader实现。 1. sprite的基本使用方法 创建精灵材质: 精灵材质有个特殊的参数rotation,可以让其旋转一定的角度。 const material = new THREE.SpriteMateria…...

Kubernetes Docker 部署达梦8数据库

Kubernetes & Docker 部署达梦8数据库 一、达梦镜像获取 目前达梦官方暂未在公共镜像仓库提供Docker镜像&#xff0c;需通过达梦官网联系获取官方镜像包。 二、Kubernetes部署方案 部署配置文件示例 apiVersion: apps/v1 kind: Deployment metadata:labels:app: dm8na…...

探索 CameraCtrl模型:视频生成中的精确摄像机控制技术

在当今的视频生成领域&#xff0c;精确控制摄像机轨迹一直是一个具有挑战性的目标。许多现有的模型在处理摄像机姿态时往往忽略了精准控制的重要性&#xff0c;导致生成的视频在摄像机运动方面不够理想。为了解决这一问题&#xff0c;一种名为 CameraCtrl 的创新文本到视频模型…...

Streamlit从入门到精通:构建数据应用的利器

在数据科学与机器学习日益普及的今天&#xff0c;如何快速将模型部署为可交互的应用成为了许多数据科学家的重要任务。Streamlit&#xff0c;作为一个开源的Python库&#xff0c;专为数据科学家设计&#xff0c;能够帮助我们轻松构建美观且直观的Web应用。本文将从入门到精通&a…...

【计算机视觉】CV实战项目- 深度解析FaceAI:一款全能的人脸检测与图像处理工具库

深度解析FaceAI&#xff1a;一款全能的人脸检测与图像处理工具库 项目概述核心功能与技术实现1. 人脸检测与识别2. 数字化妆与轮廓标识3. 性别与表情识别4. 高级图像处理 实战指南&#xff1a;项目运行与开发环境配置典型应用示例常见问题与解决方案 学术背景与相关研究项目扩展…...

快速上手GO的net/http包,个人学习笔记

更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https://gitee.com/harryhack/it_note github&#xff1a; https://github.com/ZHLOVEYY/IT_note 针对GO中net/http包的学习笔记 基础快速了解 创建简单的GOHTTP服务 func …...

达梦DMDSC初研

1.文件系统 1.1文件系统DMASM DMASM是一个分布式文件系统&#xff0c;用来管理块设备的磁盘和文件&#xff0c;DMASMCMD将物理磁盘格式化后&#xff0c;变成可识别、可管理的 ASM磁盘&#xff0c;再通过 ASM磁盘组将一个或者多个 ASM磁盘整合成一个整体提供文件服务。ASM磁盘…...

Cephalon端脑云:神经形态计算+边缘AI·重定义云端算力

前引&#xff1a;当算力不再是“奢侈品” &#xff0c;在人工智能、3D渲染、科学计算等领域&#xff0c;算力一直是横亘在个人与企业面前的“高墙”。高性能服务器价格动辄数十万元&#xff0c;专业设备维护成本高&#xff0c;普通人大多是望而却步。然而&#xff0c;Cephalon算…...

深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret

目录 深度解析 Kubernetes 配置管理&#xff1a;如何安全使用 ConfigMap 和 Secret一、目录结构二、ConfigMap 和 Secret 的创建1. 创建 ConfigMapconfig/app-config.yaml&#xff1a;config/db-config.yaml&#xff1a; 2. 创建 Secretsecrets/db-credentials.yaml&#xff1a…...

Redis的过期删除策略和内存淘汰策略

&#x1f914; 过期删除和内存淘汰乍一看很像&#xff0c;都是做删除操作的&#xff0c;这么分有什么意思&#xff1f; 首先&#xff0c;设置过期时间我们很熟悉&#xff0c;过期时间到了&#xff0c;我么的键就会被删除掉&#xff0c;这就是我们常认识的过期删除&#xff0c;…...

MySQL:数据库设计

目录 一、范式 二、第一范式 二、第二范式 三、第三范式 四、设计 &#xff08;1&#xff09;一对一关系 &#xff08;2&#xff09;一对多关系 &#xff08;3&#xff09;多对多关系 一、范式 数据库的范式是一种规则&#xff08;规范&#xff09;&#xff0c;如果我们…...

Android Kotlin AIDL 完整实现与优化指南

本文将详细介绍如何在Android中使用Kotlin实现AIDL&#xff08;Android Interface Definition Language&#xff09;&#xff0c;并提供多种优化方案。 一、基础实现 1. 创建AIDL文件 在src/main/aidl/com/example/myapplication/目录下创建&#xff1a; IMyAidlInterface.…...