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

【JavaScript基础】JavaScript头等函数的理解

彻底理解JavaScript头等函数

一、函数的理解

🔥 什么是函数?

一般来说,一个函数是可以通过外部代码 调用 的一个“子程序”(或在递归的情况下由内部函数调用)。像程序本身一样,一个函数由称为函数体的一系列语句组成

在 JavaScript 中,函数是头等 (first-class)对象,因为它们可以像任何其他对象一样具有属性和方法

💚 默认情况下,JavaScript引擎或者浏览器会内置一些已经实现好的函数。

比如:alert/prompt/console.log/String/Number/Boolean等。

💗 可以理解:函数其实就是某个代码片段的封装,这段代码帮助我们完成某一个特定的功能。

🔑 函数的概念理解

1. 声明函数—— 封装 独立的功能
  • 声明函数,在JavaScript中也称为 定义函数
    • 声明函数的过程是对某些功能的封装过程;
    • 在之后的开发中,我们会根据自己的需求定义很多自己的函数;
2. 调用函数—— 享受 封装 的成果
  • 调用函数,也可以称为 函数调用
    • 调用函数是让已存在的函数为我们所用;
    • 这些函数可以是刚刚自己封装好的某个功能函数;
    • 当然, 我们也可以去使用默认提供的或者其他三方库定义好的函数;
3. 函数的作用: 使用函数可以提高编写的效率,以及代码的重用。

❤️ 函数的使用

1. 定义函数
  • 语法

    由 关键字 funciton ,并跟随函数名称、函数参数列表、定义函数的JS语句

function name([param,[, param,[..., param]]]) {[statements]
}
  • name : 函数名
  • param : 要传递给函数的参数的名称。不同引擎中的最大参数数量不同。
  • statements : 包含函数体的语句

案例:

假设你要编写一些反复“发出叫声”的代码:在小狗较大时发出较大的 叫声(显示大写的WOOF WOOF),而小狗较小时发出较小的叫声(显 示小写的woof woof)。 之后需要在代码中多次使用这种发出叫声的功能。

下面来编写一个可反复使用的bark函数。

function bark(name, weight) {if (weight > 20) {console.log(name + ' says WOOF WOOF')} else {console.log(name + ' says woof woof')     }
}

⚠️ 函数定义完后,里面的代码是不会执行的, 函数必须调用才会执行

2. 调用函数

定义的函数并不会自动执行它。定义了函数仅仅是赋予函数以名称并明确函数被调用时该做些什么。

通过 函数名() 即可。

bark("旺旺",20) // 旺旺 says woof woof

在开发中,函数内部是可以调用另外一个函数的。

既然函数中可以调用另外一个函数,那么函数是否可以调用自己呢?

  • 当然是可以的;
  • 但是函数调用自己必须有结束条件,否则会产生无限调用,造成报错;
  • 函数调用自己还有一个专业的名词,叫做递归(Recursion)
3. 函数的参数
  • 🔥 函数,把 具有独立功能的代码块 组织为一个小模块,在需要的时候调用

  • 函数的参数,增加函数的 通用性,针对 相同的数据处理逻辑,能够 适应更多的数据

    • 在函数 内部,把参数当做 变量 使用,进行需要的数据处理;
    • 函数调用时,按照函数定义的参数顺序,把 希望在函数内部处理的数据,通过参数传递
  • 🔥 形参和实参

    • 形参(参数 parameter):定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用
    • 实参(参数 argument):调用 函数时,小括号中的参数,是用来把数据传递到 函数内部 用的。

⚠️ 形参只需定义一次,但你可能会多次调用函数,而且每次提供的实参可能不同。
bark("旺旺", 20) // 旺旺 says woof woof
bark("旺旺2", 10) // 旺旺2 says woof woof
bark("旺旺3", 18) // 旺旺3 says woof woof
bark("旺旺4", 30) // 旺旺4 says WOOF WOOF
4. 函数的返回值

回想我们之前使用的prompt函数,函数需要接受参数,并且会返回用户的输入

所以说, 🔥 函数不仅仅可以有参数,也可以有返回值:

  • 默认情况下,函数是返回 undefined 的。
  • 想要返回一个其他的值,函数必须通过一个 return 语句指定返回值
    • 一旦在函数中执行return操作,那么当前函数会终止;
    • 如果函数使用 return语句,但是 return后面没有任何值,那么函数的返回值也是:undefined;
        function sum(num1, num2) {if (num1 < 0 || num2 < 0) return '数字要大于0'return num1 + num2}console.log(sum(-1, 0)) // 数字要大于0console.log(sum(1, 2)) // 3
5. 局部变量和外部变量

🎀 在JavaScript(ES5之前)中没有块级作用域的概念,但是函数可以定义自己的作用域。

作用域(Scope) 表示一些标识符的作用有效范围(所以也有被翻译为有效范围的);

函数的作用域表示在函数内部定义的变量,只有在函数内部可以被访问到;

| 外部变量和局部变量的概念 :

​ ❣️ 定义在函数内部的变量,被称之为局部变量(Local Variables)

​ ❣️ 定义在函数外部的变量,被称之为外部变量(Outer Variables)

  • 什么是全局变量?

    • 在函数之外声明的变量(在script中声明的),称之为全局变量
    • 全局变量在任何函数中都是可见的。
  • 在函数中,访问变量的顺序是什么呢?

    • 优先访问自己函数中的变量,没有找到时,在外部中访问。
            let a = '张三'function fn() {let b = '局部b'console.log('fn中访问:', a)console.log(b)}function fn2() {console.log('fn2中访问:', a)}fn() fn2()// fn中访问: 张三// 局部b// fn2中访问: 张三
    
6. 函数表达式(Function Expressions)

在JavaScript中,函数并不是一种神奇的语法结构,而是一种特殊的值。

前面定义函数的方式,我们称之为 函数的声明(Function Declaration) ;

还有另外一种写法是 函数表达式(Function Expressions) :

var foo = function () {console.log("函数表达式 foo")
}

注意,function关键字后面没有函数名

​ 🔥 函数表达式允许省略函数名

⚠️ 无论函数是如何创建的,函数都是一个值!

7. 函数声明 vs 函数表达式
函数声明函数表达式
语法在主代码流中声明为单独的语句的函数在一个表达式中或另一个语法结构中创建的函数
JavaScript创建函数的时机在函数声明被定义之前,它就可以被调用。这是内部算法的原故; 当 JavaScript 准备 运行脚本时,首先会在脚本中寻找全局函数声明,并创建这些函数;函数表达式是在代码执行到达时被创建,并且仅从那一刻起可用

💗 开发中如何选择呢?
- 当我们需要 声明一个函数 时, 首先考虑函数声明语法
- 它能够为组织代码提供 更多的灵活性 ,因为我们可以在声明这些函数之前调用这些函数。

二、什么是头等函数?

🔥 头等函数(first-class function;第一级函数)是指在程序设计语言中,函数被当作头等公民

即,函数 可以作为 其他函数的参数、函数的返回值、赋值给变量(函数的表达式写法)、存储在数据结构中(存储在对象、数组中)或者也支持匿名函数

💡 通常我们对头等公民的编程方式,称之为 函数式编程

💗 JavaScript就是符合函数式编程的语言,这个也是JavaScript的一大特点!

1. 赋值给变量(函数表达式的写法)

    const foo1 = function () {console.log("foo1函数被执行了")}foo1() // foo1函数被执行了

2. 在变量之间来回传递

let foo2 = foo1
foo2() // foo1函数被执行了

3. 另一个函数的参数

    function foo(fn){fn()}function bar() {console.log("我是bar函数被调用了~")}foo(bar)  // 我是bar函数被调用了~

foo这种函数我们也可以称之为高阶函数(Higher-order function);

高阶函数必须至少满足两个条件之一:

  • 接受 一个或多个函数作为输入
  • 输出一个函数

4. 函数的返回值

        function sayHello(name) {function hi() {console.log("hi:", name)}return hi}const fn = sayHello("kobe") //柯里化// console.log("fn:", fn)fn() // hi: kobe

5. 存储在数据结构中

    // 函数存储在对象中const obj = {name: '张三',eating: function () {console.log("eating")}}obj.eating()// eating // 函数存储在数组中function bar1() {console.log("bar1被执行~")}function bar2() {console.log("bar2被执行~")}function bar3() {console.log("bar3被执行~")}// 事件总线const arrFns = [bar1, bar2, bar3]arrFns.forEach((fn) => {fn()})// bar1被执行~				// bar2被执行~				// bar3被执行~

6.匿名函数的理解

如果在传入一个函数时,我们没有指定这个函数的名词或者通过函数表达式指定函数对应的变量,那么这个函数称之为匿名 函数。

[参考]

  1. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions
  2. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions
  3. coderwhy

相关文章:

【JavaScript基础】JavaScript头等函数的理解

彻底理解JavaScript头等函数 一、函数的理解 &#x1f525; 什么是函数&#xff1f; 一般来说&#xff0c;一个函数是可以通过外部代码 调用 的一个“子程序”&#xff08;或在递归的情况下由内部函数调用&#xff09;。像程序本身一样&#xff0c;一个函数由称为函数体的一…...

如何把项目上传到Gitee(详细教程)

找到项目根目录右键打开Git Bash Here 输入命令&#xff1a;git init 回车 输入命令&#xff1a;git status 输入命令&#xff1a;git add . 输入命令&#xff1a;git status git commit -m 项目描述 在Gitee官网注册好账号后&#xff0c;git 新建项目 填写补充git项目信息及…...

Ubuntu挂载windows下的共享文件夹

Ubuntu挂载windows下的共享文件夹 更新apt源 如果出现安装失败&#xff0c;需要更新apt源为阿里云 # 备份原始文件 sudo cp /etc/apt/sources.list.d/* /etc/apt/sources.list.d.bak/# 修改文件内容 sudo vim /etc/apt/sources.list# 替换内容为如下 deb https://mirrors.al…...

什么是WMS系统条码化管理

WMS系统是一种用于仓库管理的信息化系统&#xff0c;旨在提高仓库操作的效率和准确性。而在WMS系统中&#xff0c;条码化管理是一项关键的技术和方法&#xff0c;它通过将商品和物料打上条码&#xff0c;并利用扫描设备进行数据采集和处理&#xff0c;实现了仓库管理的全面自动…...

【云原生之kubernetes实战】在k8s环境下部署moredoc文库系统

【云原生之kubernetes实战】在k8s环境下部署moredoc文库系统 一、moredoc介绍1.1 moredoc简介1.2 moredoc技术栈二、本次实践介绍2.1 本次实践简介2.2 本次环境规划三、检查k8s环境3.1 检查工作节点状态3.2 检查系统pod状态四、创建mysql的secret资源4.1 创建部署目录4.2 创建密…...

[Database] MySQL 8.x Window / Partition Function (窗口/分区函数)

&#x1f9f2;相关文章 [1] MySQL 系统表解析以及各项指标查询 [2] MySQL 5.7 JSON 字段的使用的处理 [3] MySQL经典练习50题 简介 MySQL 8.0版本开始支持窗口函数 官方文档 在之前的版本中已存在的大部分聚合函数&#xff0c;在MySQL 8 中也可以作为窗口函数来使用 方法 / …...

openGauss Meetup(天津站)精彩回顾 | openGauss天津用户组正式成立

由openGauss社区、天开发展集团、天津市软件行业协会、天大智图&#xff08;天津&#xff09;科技有限公司联合主办的“openGauss Meetup • 天津站”已于10月13日落下帷幕&#xff0c;此次活动邀请到众多业内技术专家&#xff0c;从技术创新、学术创新、发展创新、以及生态共建…...

linux vim 删除多行

使用linux服务器&#xff0c;免不了和vi编辑打交道&#xff0c;命令行下删除数量少还好&#xff0c;如果删除很多&#xff0c;光靠删除键一点点删除真的是头痛&#xff0c;还好Vi有快捷的命令可以删除多行、范围。 删除行 在Vim中删除一行的命令是dd。 以下是删除行的分步说明…...

低概率Bug,研发敷衍说复现不到

测试工作中&#xff0c;经常会遇到一些低概率出现的问题&#xff0c;如果再是个严重问题&#xff0c;那测试人员的压力无疑是很大的&#xff0c;一方面是因为低概率难以复现&#xff0c;另一面则是来自项目组的压力。 如何在测试时减少此类问题的重复投入&#xff0c;我的思考如…...

Web前端免费接入Microsoft Azure AI文本翻译,享每月2百万个字符的翻译

Azure 文本翻译是 Azure AI 翻译服务的一项基于云的 REST API 功能。 文本翻译 API 支持实时快速准确地进行源到目标文本翻译。 文本翻译软件开发工具包 (SDK) 是一组库和工具&#xff0c;可用于轻松地将文本翻译 REST API 功能集成到应用程序中。 文本翻译 SDK 可跨 C#/.NET、…...

1024 CSDN 程序员节-知存科技-基于存内计算芯片开发板验证语音识别

前言 在今年的 CSDN 程序员节上&#xff0c;我参与了这次知存科技举办的一个 AI Workshop 小活动——“基于存内计算芯片开发板验证语音识别”&#xff0c;并且有幸成为完成任务的学习者之一XD。上一次参与类似的活动是算能公司举办的“千校万里行”AIGC 大模型编译部署活动&a…...

【备考网络工程师】如何备考2023年网络工程师之错题集篇(3)

一、写在前面 其实做模拟或真题时候&#xff0c;总是会在关键的地方丢分&#xff0c;因此我也冷静下来思考一下&#xff0c;首先我们对做过的题涉及的知识进行一个梳理&#xff0c;其次就是再针对知识去做一些题目&#xff0c;这次只考了38分&#xff0c;表示很伤心&#xff0…...

密码学-SHA-1算法

实验七 SHA-1 一、实验目的 熟悉SHA-1算法的运行过程&#xff0c;能够使用C语言编写实现SHA-1算法程序&#xff0c;增 加对摘要函数的理解。 二、实验要求 (1)理解SHA-1轮函数的定义和工作过程。 (2)利用VC语言实现SHA- 1算法。 (3)分析SHA- 1算法运行的性能。 三、实验…...

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder,Kotlin(2)

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder&#xff0c;Kotlin&#xff08;2&#xff09; import android.graphics.Canvas import android.graphics.Point import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util…...

翻页视图ViewPager

ViewPager控件允许页面在水平方向左右滑动&#xff0c;就像翻书、翻报纸&#xff0c;Android提供了已经分装好的控件。对于ViewPager来说&#xff0c;一个页面就是一个项&#xff08;相当于ListView的一个列表项&#xff09;&#xff0c;许多页面组成ViewPager的页面项。 List…...

【可视化Java GUI程序设计教程】第4章 布局设计

4.1 布局管理器概述 右击窗体&#xff0c;单击快捷菜单中的Set Layout 4.1.2 绝对布局&#xff08;Absolute Layout&#xff09; 缩小窗口发现超出窗口范围的按钮看不见 Absolute Layout 4.1.2 空值布局&#xff08;Null Layout&#xff09; 4.1.3 布局管理器的属性和组件布…...

Elasticsearch配置文件

一 前言 在elasticsearch\config目录下,有三个核心的配置文件: elasticsearch.yml,es相关的配置。jvm.options,Java jvm相关参数的配置。log4j2.properties,日志相关的配置,因为es采用了log4j的日志框架。这里以elasticsearch6.5.4版本为例,并且由于版本不同,配置也不…...

运维:mysql常用的服务器状态命令

目录 1、查询当前服务器运行的进程 2、查询最大链接数 3、查询当前链接数 4、展示当前正在执行的sql语句 5、查询当前MySQL当中记录的慢查询条数 6、展示Mysql服务器从启动到现在持续运行的时间 7、查询数据库存储占用情况 8、查询服务器启动以来的执行查询的总次数 9…...

k8s中kubectl陈述式资源管理

1、 理论 1.1、 管理k8s核心资源的三种基本方法 &#xff1a; 1.1.1陈述式的资源管理方法&#xff1a; 主要依赖命令行工具kubectl进行管理 1.1.1.1、优点&#xff1a; 可以满足90%以上的使用场景 对资源的增、删、查操作比较容易 1.1.1.2、缺点&#xff1a; 命令冗长&…...

11 个最值得推荐的 Windows 数据恢复软件

您可能已经尝试过许多免费的恢复程序&#xff0c;但它们都不起作用&#xff0c;对吧&#xff1f;这就是您正在寻找最好的数据恢复软件的原因。 个人去过那里。根据个人的经验&#xff0c;大多数免费软件并不能解决这个问题。有时&#xff0c;当个人在 PC 上运行恢复程序时&…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...