深入理解 JavaScript 函数:提升编程技能的必备知识(上)

news2025/2/3 11:09:12

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍函数在 JavaScript 中的重要性
  • 二、函数的定义和语法
    • 函数的基本定义
    • 函数的命名规则
    • 函数的参数和返回值
    • 函数的调用方式
  • 三、函数的作用域和闭包
    • 全局函数和局部函数
    • 函数的作用域链
    • 闭包的概念和应用

一、引言

介绍函数在 JavaScript 中的重要性

函数在 JavaScript 中非常重要,它们是 JavaScript 编程的基本构建块。以下是函数在 JavaScript 中的一些重要性:

  1. 代码重用:函数允许你将一段代码封装为一个可重复调用的单元。通过定义函数,你可以在程序的不同地方调用相同的代码,从而避免重复编写相同的逻辑。

  2. 模块化编程:函数有助于将代码划分为较小的可管理的模块。每个函数都可以专注于完成特定的任务,从而使代码更易于理解和维护。

  3. 可读性和可维护性:函数可以通过给代码赋予有意义的名称来提高可读性。这样,其他人在阅读代码时可以更容易地理解函数的目的和功能。良好命名的函数也有助于代码的维护,因为它们使你能够快速找到并修改相关的代码部分。

  4. 封装和信息隐藏:函数可以将相关的变量和逻辑封装在一起,隐藏实现细节。这有助于提高代码的安全性和可维护性,并防止外部代码直接访问和修改内部状态。

  5. 参数传递和返回值:函数可以接受输入参数,并根据这些参数执行相应的操作。它们还可以返回输出值,使得函数能够与其他代码进行交互。

  6. 递归:函数可以递归地调用自身,这对于解决一些递归问题非常有用。例如,计算斐波那契数列、遍历目录结构等。

  7. 事件处理:在 JavaScript 中,函数可以作为事件处理程序来响应各种事件,如点击、鼠标移动、键盘输入等。这使得你能够编写交互性的网页和应用程序。

在这里插入图片描述

总之,函数是 JavaScript 中的重要概念,它们提供了代码重用、模块化编程、可读性、可维护性、封装、参数传递和返回值等重要特性。熟练使用函数是成为一名优秀 JavaScript 开发者的关键。

二、函数的定义和语法

函数的基本定义

在 JavaScript 中,函数可以使用以下语法进行定义:

function functionName(parameters) {
  // 函数体
  // 可选的 return 语句
  return returnValue;
}
  • functionName:给函数起的名称,可以根据需要自行命名。
  • parameters:函数的参数列表,多个参数之间用逗号分隔。参数可以是任何有效的 JavaScript 表达式。
  • 函数体:包含了函数的具体逻辑和操作。你可以在函数体中编写任意数量的 JavaScript 语句。
  • return 语句:用于返回函数的返回值。如果函数没有显式地返回值,则会自动返回 undefined

以下是一个简单的示例函数:

function addNumbers(a, b) {
  return a + b;
}

在这个示例中,定义了一个名为 addNumbers 的函数,它接受两个参数 ab,并返回它们的和。

要调用函数,你可以使用函数名并提供相应的参数:

var result = addNumbers(3, 5);
console.log(result); 

在上述示例中,调用了 addNumbers 函数,并将 3 和 5 作为参数传递给它。函数执行后,返回的值存储在变量 result 中,并通过 console.log() 打印出来。

你可以根据需要定义自己的函数,并根据函数的定义进行调用。函数可以包含复杂的逻辑和操作,并且可以在程序的不同部分被调用,从而实现代码的重用和封装。

函数的命名规则

在 JavaScript 中,函数的命名规则主要有以下几点:

  1. 函数名可以包含字母、数字、下划线(_)和美元符号($)。
  2. 函数名不能以数字开头。
  3. 函数名是区分大小写的。
  4. 函数名应该具有描述性,能够清晰地表达函数的功能。
  5. 函数名可以使用驼峰命名法(Camel Case)或蛇形命名法(Snake Case),但通常推荐使用驼峰命名法。
  6. 避免使用保留字作为函数名。

在这里插入图片描述

以下是一些示例的函数命名:

// 驼峰命名法
function calculateSum(num1, num2) {
  return num1 + num2;
}

// 蛇形命名法
function calculate_sum(num1, num2) {
  return num1 + num2;
}

在函数命名时,应尽量选择有意义的名称,以便更好地理解函数的功能和用途。同时,遵循一致的命名规则有助于提高代码的可读性和可维护性。

函数的参数和返回值

在 JavaScript 中,函数可以接受零个或多个参数,并可以返回一个或多个值。

函数的参数是在函数调用时传递给函数的值。参数可以是任何有效的 JavaScript 表达式,包括数字、字符串、对象等。函数可以通过参数来接收和处理输入数据,从而实现更灵活和通用的功能。

例如,以下是一个接受两个参数的函数:

function addNumbers(num1, num2) {
  return num1 + num2;
}

在这个示例中,addNumbers 函数接受两个参数 num1num2,并返回它们的和。

函数的返回值是函数执行完毕后返回的结果。返回值可以是任何有效的 JavaScript 表达式,包括数字、字符串、对象等。函数可以通过返回值来向调用方返回处理后的结果,以便在程序的其他部分使用。

例如,以下是一个返回字符串的函数:

function greeting(name) {
  return `Hello, ${name}!`;
}

在这个示例中,greeting 函数接受一个参数 name,并返回一个包含问候语的字符串。

函数的参数和返回值可以根据具体的需求进行定义和使用。通过合理地设计函数的参数和返回值,可以使函数更加灵活、可复用,并提高代码的可读性和维护性。

函数的调用方式

在 JavaScript 中,函数的调用方式有以下几种:

  1. 直接调用:使用函数名并后跟括号来调用函数。
function addNumbers(num1, num2) {
  return num1 + num2;
}

var result = addNumbers(3, 5); 
console.log(result); 

在上述示例中,定义了一个名为 addNumbers 的函数,然后通过 addNumbers(3, 5) 直接调用该函数,并将返回值存储在变量 result 中。

  1. 作为方法调用:如果函数是对象的方法,可以通过对象的点操作符来调用。
var obj = {
  name: "John",
  greeting: function() {
    return `Hello, ${this.name}!`;
  }
};

console.log(obj.greeting()); 

在上述示例中,定义了一个对象 obj,其中包含一个名为 greeting 的方法。通过 obj.greeting() 调用该方法,并输出结果。

  1. 作为构造函数调用:使用 new 关键字来调用构造函数,创建一个新的对象。
function Person(name) {
  this.name = name;
}

var person = new Person("John"); 
console.log(person.name); 

在上述示例中,定义了一个名为 Person 的构造函数,然后通过 new Person("John") 创建一个新的 Person 对象,并将其存储在变量 person 中。

  1. 函数调用:一个函数可以调用其他函数。
function callAnotherFunction() {
  anotherFunction();
}

function anotherFunction() {
  console.log("函数被调用了");
}

callAnotherFunction(); 

在上述示例中,定义了两个函数 callAnotherFunctionanotherFunction。在 callAnotherFunction 函数中,调用了 anotherFunction 函数。

这些是函数的常见调用方式,可以根据具体的需求选择适合的调用方式。无论哪种方式,函数都会按照其定义的逻辑执行,并返回相应的结果。

三、函数的作用域和闭包

全局函数和局部函数

在 JavaScript 中,函数可以分为全局函数和局部函数。

全局函数是在全局作用域中定义的函数,可以在整个 JavaScript 程序中被调用。全局函数可以直接在任何地方使用,不需要在特定的上下文环境中进行定义。

例如,以下是一个全局函数的示例:

function globalFunction() {
  console.log("这是一个全局函数");
}

globalFunction(); 

在上述示例中,定义了一个名为 globalFunction 的全局函数,可以在程序的任何地方通过 globalFunction() 来调用。

局部函数是在特定的上下文环境中定义的函数,只能在该上下文环境中被调用。局部函数通常作为函数内部的函数(也称为嵌套函数)或者作为模块的私有函数来使用。

例如,以下是一个局部函数的示例:

function outerFunction() {
  function innerFunction() {
    console.log("这是一个局部函数");
  }

  innerFunction(); 
}

outerFunction(); 

在上述示例中,定义了一个名为 outerFunction 的函数,其中包含了一个名为 innerFunction 的局部函数。只有在调用 outerFunction() 时,才能通过 innerFunction() 来调用局部函数。

全局函数和局部函数在作用域和可访问性上有所不同。全局函数可以在整个程序中访问,而局部函数只能在特定的上下文环境中访问。合理使用全局函数和局部函数可以提高代码的模块化和可维护性。

函数的作用域链

在 JavaScript 中,函数的作用域链是指存放函数执行时候的环境,也就是执行上下文的集合,这些集合呈链式结构。当要查找某变量时,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。

函数的作用域链在函数定义的时候就已经确定,并且在函数的执行过程中会一直存在,直到函数执行结束。作用域链的方向是从下向上(从内到外),查找变量时会沿着作用域链来查找。

闭包的概念和应用

闭包是指在函数内部创建一个独立的作用域,该作用域中的变量和函数可以在函数外部被访问。
即使函数执行完毕,闭包中的变量和函数仍然可以被访问。

闭包有以下几个特点:

  1. 函数嵌套函数:闭包必须有函数嵌套函数的结构。
  2. 内部函数可以访问外部函数的变量:内部函数可以访问外部函数中的变量,即使外部函数已经执行完毕。
  3. 外部函数返回内部函数:外部函数必须返回内部函数,才能形成闭包。

在这里插入图片描述

闭包的应用场景包括:

  1. 私有变量:通过闭包可以在函数内部创建私有变量,这些变量只能在闭包内部访问。
  2. 模块封装:将相关的函数和变量封装在一个闭包中,形成一个独立的模块。
  3. 缓存数据:闭包可以用来缓存一些计算结果,避免重复计算。
  4. 事件监听:闭包可以用来创建事件监听器,当事件触发时,闭包中的函数会被调用。

在这里插入图片描述

以下是一个简单的闭包示例:

let result = (function () {
  var money = 20000;
  function spendMoney(amount) {
    money -= amount;
    console.log(`还剩 ${money}`);
  }
  // 将子函数返回出去
  return spendMoney;
})();

result(5000);
result(3000);
result(2000);

在这个示例中,创建了一个闭包,它包含了一个私有变量 money 和一个函数 spendMoneyspendMoney 函数可以用来花费 money 中的金额。通过将 spendMoney 函数作为闭包的返回值,我们可以在外部调用它,并修改闭包中的私有变量 money 的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1328790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python/C 生成beta分布的随机数

python/C 生成beta分布的随机数 文章目录 python/C 生成beta分布的随机数前言一、beta分布理论知识二、python 生成服从beta分布的随机数三、C语言生成服从beta分布的随机数 前言 想把一个算法用C语言实现,其中涉及到了beta分布取随机数,记录一下结果 一…

JOSEF约瑟 零序电流互感器DH-30L DH-70L 配套DJ-ZB1漏电继电器使用

系列型号 DH-16L型配套用零序(剩余)电流互感器DH-20L型配套用零序(剩余)电流互感器 DH-23L型配套用零序(剩余)电流互感器DH-30L型配套用零序(剩余)电流互感器 DH-45L型配套用零序&am…

【Linux笔记】文件查看和编辑

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 cat (Concatenate and Display): more 和 less: nano 和 vim (文本编辑器): 结语 我的其他博客 前言 学习Linux命令行和文件…

测试框架|Burp Suite几个基本工具的使用

前阵子项目上想通过测试工具在网页上模拟返回错误代码 500 来查看页面的错误处理,然后去调查了下 burp suite,看了些基本工具的使用文档。虽然最后证实 burp suite 只能用来处理页面测试应用程序的实际行为和响应,而不是尝试模拟不存在的问题…

大数据求职心得

........................................................................................................................................................... 大数据求职心得 ...................................................................................…

GCC:GNU编译器

GCC(GNU Compiler Collection)是一款广泛使用的开源编译器套件,支持多种编程语言,包括C、C、Objective-C、Fortran、Ada和Go等。在本文中,我们将通过一个简单的C程序来介绍GCC的编译过程,包括预处理、编译、…

HrSegNet 23年裂缝检测新文章基于PaddelPaddle和Paddleseg的复现

本文章是对2023年发表在Automation in Construction上论文 Real-time High-Resolution Neural Network with Semantic Guidance for Crack Segmentation 的复现。 我参考了作者上传至github的代码,并得到了作者的帮助。https://github.com/CHDyshli/HrSegNet4Cra…

4G微型RTU如何实现冬季工业管网远程监测

随着我国北方全面进入到冬季,多日以来严寒、降雪天气频发,工业基础设施也迎来冬季考验。对于一些输送化工原料、油气和给排水等用途的工业管网设施,在面临极端冰雪天气时易产生各种风险,诸如管道水/气泄漏损耗、低温冻裂、积雪压塌…

DBdoctor,MySQL 性能问题终结者

本文 5542 字,读完大约需要 8 分钟(文末有惊喜 License!) 17(一起),这是我的幸运数字,恰巧今年 8 月 17 日在 DTCC 大会上我们全网首次发布 DBdoctor 数据库性能诊断软件(简称 DBdoctor&#x…

pake协议传输文件magic-wormhole

pake协议传输文件magic-wormhole 1 magic-wormhole简介其他介绍 2 安装magic-wormhole3 使用示范发送文件指定虫洞码长度 接收文件 1 magic-wormhole简介 16.7k star 强推,丝滑、简洁、安全的开源工具——magic-wormhole 项目地址:https://github.com/…

Debug

0、Debug的步骤 Debug(调试)程序步骤如下: 1、添加断点 2、启动调试 3、单步执行 4、观察变量和执行流程,找到并解决问题 1、添加断点 在源代码文件中,在想要设置断点的代码行的前面的标记行处,单击鼠标左键就可以设置断点&…

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据

1.File(操作文件本身) 1.定义 目录 2.常用方法 3.路径引用符 可以用/或者\\分隔路径 还可以用File.separator分隔路径,会根据不同系统使用啥分隔符。 4.绝对路径、相对路径及桌面路径表示 桌面路径为: 我电脑的用户名为X 5.示例…

RobotMaster学习——工序导入,参数设置,轨迹生成

目录 引出1.导入工序2.修改刀具其他刀具参数 3.进行工序分配4.设置TCP5.设置工作站6.工序整体导入配置7.进行计算 总结 引出 RobotMaster的操作流程,从导入工序到生产轨迹。 1.导入工序 2.修改刀具 要选择第七把刀具 其他刀具参数 第一把刀具 第二把刀具 第三把刀…

Certum属于企业的泛域名ssl证书

泛域名SSL证书可以保护主域名以及其下所有二级域名,所以也可以叫它通配符SSL证书。Certum旗下有两种泛域名SSL证书,一种是入门级的泛域名SSL证书,支持个人或者企事业单位申请,一种是企业泛域名SSL证书,只能企事业单位申…

Sublime Text 3配置 C# 开发环境

Sublime Text 3配置 C# 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 C#3. 接入 .NET Framework3.1 下载 .NET Framework3.2 环境变量配置 4. 配置 C# 开发环境5. 编写 C# 代码6. 运行 C# 代码 三、总结 一、引言 C# 是一种面向对象的编程语言,由微…

STL中优先队列(堆)的详解

文章目录 priority_queue的基本介绍堆(heap)堆的概念与结构 priority_queue 的介绍与使用 priority_queue的基本介绍 这个priority_queue翻译成中文就是优先级队列,但其实我们很难去一眼看出他的意思到底是什么,他的逻辑结构实际上类似于数据结构中的堆…

深度剖析:Golang中结构体方法的高级应用

深度剖析:Golang中结构体方法的高级应用 引言结构体方法的基础回顾结构体的定义和用法方法的定义和绑定基本语法和用法 高级特性与应用封装、继承和多态方法集与接口的关系结构体方法的匿名字段和嵌入结构体 性能优化与最佳实践接收器类型的选择:指针还是…

SpringIOC之LocaleContext

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

听GPT 讲Rust源代码--src/tools(23)

File: rust/src/tools/clippy/rustc_tools_util/src/lib.rs 在Rust源代码中,rust/src/tools/clippy/rustc_tools_util/src/lib.rs文件的作用是为Clippy提供了一些实用工具和辅助函数。 该文件中定义了VersionInfo结构体,它有三个字段,分别为m…

【toolschain algorithm cpp ros】cpp工厂模式实现--后续填充具体规划算法,控制器版的已填充了算法接入了仿真器

写在前面 现在局势危机,于是想复习一下之前写的设计模式,之前提到,做过一个闭环仿真器(借用ros),见https://blog.csdn.net/weixin_46479223/article/details/134864123我的控制器的建立遵循了工厂模式&…