当前位置: 首页 > 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 上运行恢复程序时&…...

Docker从入门到实战

Docker基本概念 1、解决的问题 1、统一标准 应用构建 ○ Java、C、JavaScript ○ 打成软件包 ○ .exe ○ docker build … 镜像应用分享 ○ 所有软件的镜像放到一个指定地方 docker hub ○ 安卓&#xff0c;应用市场应用运行 ○ 统一标准的 镜像 ○ docker run 容器化技术 …...

UE4 材质实操记录

TexCoord的R通道是从左到右的递增量&#xff0c;G通道是从上到下的递增量&#xff0c;R通道减去0.5&#xff0c;那么左边就是【-0.5~0】区间&#xff0c;所以左边为全黑&#xff0c;Abs取绝对值&#xff0c;就达到一个两边向中间的一个递减的效果&#xff0c;G通道同理&#xf…...

http协议和Fiddler

文章目录 一、http协议的报文结构1.1http请求和http响应之间的区别1.2http请求1.2.1URL1.2.2方法1.2.3请求头1.2.3.1Host1.2.3.2Content-Length、Content-Type1.2.3.3User-Agent(简称UA)1.2.3.4Referer1.2.3.5Cookie 1.3http响应1.3.1响应状态码1.3.2响应头1.3.2.1Content-Leng…...

李宇航

该篇文章仅用作能直接在百度搜索到我的csdn,进入我的主页,没有实际意义. 进入李宇航博客方法 通过百度搜索"李宇航" 链接: https://blog.csdn.net/llllyh812 1.电脑端进入方法 输入网址链接: https://blog.csdn.net/llllyh812 或者 进入csdn主页,搜索"李宇…...

【JAVA学习笔记】38 - 单例设计模式-静态方法和属性的经典使用

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_ 一、什么是设计模式 1.静态方法和属性的经典使用 2.设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式。设计模式就像是…...

m1 安装 cocoapods

其实最终解决问题很简单&#xff0c;麻烦的是如果找到解决问题的答案。 前提条件&#xff1a; 命令行工具&#xff0c;不能以rosetta方法打开。 首先安装homebrew 这里不多说了&#xff0c;自行解决。 使用brew安装cocoapods brew install cocoapods&#xff0c; pod --ver…...

【大数据】Kafka 实战教程(一)

Kafka 实战教程&#xff08;一&#xff09; 1.Kafka 介绍1.1. 主要功能1.2. 使用场景1.3 详细介绍1.3.1 消息传输流程1.3.2 Kafka 服务器消息存储策略1.3.3 与生产者的交互1.3.4 与消费者的交互 2.Kafka 生产者3.Kafka 消费者3.1 Kafka 消费模式3.1.1 At-most-once&#xff08;…...

求臻医学:肺癌患者就诊指南及基因检测意义

2023年国家癌症中心公布的最新的数据显示&#xff0c;中国癌症新发病例数前十的癌症分别是&#xff1a;肺癌82万&#xff0c;结直肠癌56万&#xff0c;胃癌48万&#xff0c;乳腺癌42万&#xff0c;肝癌41万&#xff0c;食管癌32万&#xff0c;甲状腺癌22万&#xff0c;胰腺癌12…...

【项目管理】项目中如何进行风险管理

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…...

【算法题】得到K个半回文串的最小修改次数

题目&#xff1a; 给你一个字符串 s 和一个整数 k &#xff0c;请你将 s 分成 k 个 子字符串 &#xff0c;使得每个 子字符串 变成 半回文串 需要修改的字符数目最少。 请你返回一个整数&#xff0c;表示需要修改的 最少 字符数目。 注意&#xff1a; 如果一个字符串从左往…...