【JavaScript】七、函数

文章目录

  • 1、函数的声明与调用
  • 2、形参默认值
  • 3、函数的返回值
  • 4、变量的作用域
  • 5、变量的访问原则
  • 6、匿名函数
    • 6.1 函数表达式
    • 6.2 立即执行函数
  • 7、练习
  • 8、逻辑中断
  • 9、转为布尔型

在这里插入图片描述

1、函数的声明与调用

function 函数名(形参列表) {函数体
}

eg:

// 声明
function sayHi() {console.log('Hello World!')
}// 调用
sayHi()

在这里插入图片描述

注意:

  • 形参不需要带类型

  • 两个相同的函数后面的会覆盖前面的函数

  • 参的个数和形参的个数可以不一致,形参过多,默认给undefined,实参过多,多余的实参会被忽略 (函数内部有一个arguments,里面装着所有的实参)

在这里插入图片描述

命名规范:

  • 和变量命名基本一致

在这里插入图片描述

  • 尽量小驼峰式命名法
  • 前缀应该为动词

在这里插入图片描述

2、形参默认值

<body><script>function getSum(num1, num2) {document.write(num1 + num2)}// 3getSum(1, 2)// NaNgetSum()</script>
</body>

如上,形参不传值,计算结果是NaN,形参也是一个变量,不给值,则是undefined,undefined + unfined = NaN,改进下:

function getSum(num1 = 0, num2 = 0) {document.write(num1 + num2)
}

形参默认值只会在缺少实参参数传递时才会被执行

// 练习:数组求和函数
<body><script>function getArrSum(array = []) {let sum = 0for (let i = 0; i < array.length; i++) {sum = sum + array[i]}console.log(sum)}getArrSum([1, 2, 3, 4, 5])getArrSum()</script>
</body>

3、函数的返回值

function getSum(num1, num2) {return num1 + num2
}
  • return结果给调用者
  • return 后面代码不会再被执行
  • return函数可以没有return语句,此时,默认返回undefined
function getSum(num1, num2) {num1 + num2
}// 调用一个没有返回结果的函数,查看调用结果
console.log(getSum(1, 2))	//undefined

在这里插入图片描述

练习: 求一个数组的最大值

<body><script>function getMax(array = []) {let max = array[0]for (let i = 1; i < array.length; i++) {if (max < array[i]) {max = array[i]}}return max}console.log(getMax([1, 3, 4, 6, 9]))</script>
</body>

4、变量的作用域

在这里插入图片描述

作用域:

在这里插入图片描述

对应的,变量分为:全局变量和局部变量

在这里插入图片描述

<body><script>// 全局变量let num = 0// 函数中可以用function getNum() {return num}// 函数外面也能用console.log(num)</script>
</body>
<body><script>function doSome() {// 局部变量let i = 1return i}// 局部变量,函数外不可用,报错i is not definedconsole.log(i)</script>
</body>

最后,作用域有一个坑:如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐

<body><script>function doSome() {// 不声明,直接赋值num = 1}// 调用一下doSome()// 1,访问成功console.log(num)</script>
</body>

5、变量的访问原则

如下,输出是20,首先两个num作用域不同,并不冲突,其次,console.log打印时,num就近

在这里插入图片描述

访问原则:

  • 在能够访问到的情况下 先局部, 局部没有在找全局,遵循就近原则
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域

在这里插入图片描述

6、匿名函数

在这里插入图片描述
函数定义完需要调用,匿名函数没有名字,因此不能像具名函数一样通过名字调用,其调用方式有两种:

  • 函数表达式
  • 立即执行函数

6.1 函数表达式

语法是将匿名函数赋值给一个变量
在这里插入图片描述

<body><script>let fn = function(num) {console.log('函数表达式的方式')}// 调用fn(1)</script>
</body>

这种写法很像常规的具名函数定义,但有区别:

在这里插入图片描述
在这里插入图片描述

也就是说,具名函数的调用,可以写在任何位置,而匿名函数用函数表达式来调用是不行的,因为函数表达式是一个let,最后,匿名函数的使用场景举例:在Web API中

在这里插入图片描述

在这里插入图片描述

6.2 立即执行函数

写法:拿个小括号包着匿名函数,最后再加个空的小括号,第二个小括号是在做调用,因此,这个函数一定义,匿名函数就立马被执行了,因此,叫立即执行函数

在这里插入图片描述

封号也可以写前面,以下两种写法都行:

<body><script>(function () {console.log(1)})();(function () {console.log(2)})();</script>
</body>
// 封号写前面
<body><script>; (function () {console.log(1)})(); (function () {console.log(2)})()</script>
</body>

立即执行函数还有个作用:防止变量污染

在这里插入图片描述

再体会下,上面说的第二个小括号是在做调用

<body><script>(function (x, y) {console.log(x + y)})(1, 3);</script>
</body>

匿名函数的立即执行函数写法,还有一种写法,小括号里面包着匿名函数 + 一个空的小括号

在这里插入图片描述

最后,多个立即执行函数要用 ; 隔开,要不然会报错。未来其使用场景如:

在这里插入图片描述

立即执行函数也可以有函数名,如下,写成立即执行函数,一来不用再特地调用,二来,这个JS文件被引入后,即使JS中定义了变量,也不会引起变量污染

在这里插入图片描述

7、练习

需求: 用户输入秒数,可以自动转换为时分秒

<body><script>function convertTime(totalSecond = 0) {let hour = parseInt(totalSecond / 60 / 60 % 24)let minute = parseInt(totalSecond / 60 % 60)let second = parseInt(totalSecond % 60)// 补0,让1小时变成01小时hour = hour < 10 ? '0' + hour : hourminute = minute < 10 ? '0' + minute : minutesecond = second < 10 ? '0' + second : secondreturn `${hour}${minute}${second}`}let totalSecond = +prompt('输入总秒数')document.write(convertTime(totalSecond))</script>
</body>

此外,hour = hour < 10 ? '0' + hour : hour其实也体现了JS的弱类型,hour本身是数字型,最后重新赋值可能是一个String型,也没报错

8、逻辑中断

通过左边能得到整个式子的结果,因此没必要再判断右边,即短路

在这里插入图片描述

// 都是真,返回最后一个真值
console.log(11 && 22)	//22//逻辑或,返回最后一个真值
console.log(11 || 22)	//11

下面这个写法,和给形参给默认值,效果一样,x和y不传时,为undefined,当false看,做逻辑与,就是0,最后结果为0 + 0

在这里插入图片描述

未来短路运算的使用场景:

在这里插入图片描述

注意⚠️,和Java不同,JS的短路与和短路或 操作符返回的是操作数的值,而不是布尔值(true 或 false)

9、转为布尔型

显示转换语法:

Boolean(内容)

''、0、undefined、null、false、NaN 转换为布尔值后都是false, 其余则为 true

console.log(Boolean('hahhah'))  //true
console.log(Boolean(0))         //false
console.log(Boolean(NaN))       //false
console.log(Boolean(111))       //true

有了这个前提,再看

// null
console.log(null && 20) 

null当false看,那短路,结果是null,注意,返回是null,我没加Boolean,下面这个返回才是false

//false
console.log(Boolean(null) && 20) 

在这里插入图片描述

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

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

相关文章

硬件基础--05_电压

电压(电势差) 有了电压&#xff0c;电子才能持续且定向移动起来&#xff0c;所有电压是形成电流的必要条件。 电压越大&#xff0c;能“定向移动”起来的电子就越多&#xff0c;电流就会越大。 有电压的同时&#xff0c;形成闭合回路才会有电流&#xff0c;不是有电压就有电流…

ES数据过多,索引拆分

公司企微聊天数据存储在 ES 中&#xff0c;虽然按照企业分储在不同的ES 索引中&#xff0c;但某些常用的企微主体使用量还是很大。4年中一个索引存储数据已经达到46多亿条数据&#xff0c;占用存储3.1tb, ES 配置 由于多一个副本&#xff0c;存储得翻倍&#xff0c;成本考虑…

存储服务器是指什么

今天小编主要来为大家介绍存储服务器主要是指什么&#xff0c;存储服务器与传统的物理服务器和云服务器是不同的&#xff0c;其是为了特定的目标所设计的&#xff0c;在硬件配置方式上也有着一定的区别&#xff0c;存储空间会根据需求的不同而改变。 存储服务器中一般会配备大容…

golang不使用锁的情况下,对slice执行并发写操作,是否会有并发问题呢?

背景 并发问题最简单的解决方案加个锁,但是,加锁就会有资源争用,提高并发能力其中的一个优化方向就是减少锁的使用。 我在之前的这篇文章《开启多个协程,并行对struct中的每个元素操作,是否会引起并发问题?》中讨论过多协程场景下struct的并发问题。 Go语言中的slice在…

Java知识整理round1

一、常见集合篇 1. 为什么数组索引从0开始呢&#xff1f;假如从1开始不行咩 数组&#xff08;Array&#xff09;&#xff1a;一种用连续的内存空间存储相同数据类型数据的线性数据结构 &#xff08;1&#xff09;在根据数组索引获取元素的时候&#xff0c;会用索引和寻址公式…

【C++指针】搭建起程序与内存深度交互的桥梁(下)

&#x1f525;&#x1f525; 个人主页 点击&#x1f525;&#x1f525; 每文一诗 &#x1f4aa;&#x1f3fc; 往者不可谏&#xff0c;来者犹可追——《论语微子篇》 译文&#xff1a;过去的事情已经无法挽回&#xff0c;未来的岁月还可以迎头赶上。 目录 C内存模型 new与…

JavaScript创建对象的多种方式

在JavaScript中&#xff0c;创建对象有多种方式&#xff0c;每种方式都有其优缺点。本文将介绍四种常见的对象创建模式&#xff1a;工厂模式、构造函数模式、原型模式和组合模式&#xff0c;并分析它们的特点以及如何优化。 1. 工厂模式 工厂模式是一种简单的对象创建方式&am…

muduo库的思路梳理

前言 对于muduo库源码的剖析我发现还是有些混乱的&#xff0c;所以这里再次梳理一下muduo网络库争取可以简单明了 首先对于muduo库来说&#xff0c;不能想的得太过于复杂&#xff0c;它无非就是一个线程池加上epoll组成的网络库 这里我们从用的角度出发理解muoduo网络库 #inc…

Keil5 安装全攻略

Keil5 安装全攻略 Keil5 是一款广泛用于嵌入式开发的 IDE&#xff0c;支持多种微控制器架构&#xff08;如 ARM、C51&#xff09;。本文将详细介绍 Keil5 的安装步骤、常见问题及解决方法&#xff0c;帮助您快速上手。 1. 安装前的准备工作 (1) 系统要求 操作系统&#xff1…

C语言do...while语句将数字反转后输出

一、题目引入 输入一个数字,将各位数字反转后输出? 参考代码: 二、分析代码 接着图片中的分析 第一 ->a 的值变为12 第二 ->进入while循环条件,a为12不等于0循环才停止(a的值为12,显然不等于0) 所以继续进行循环 第三 ->此时b的值为12取各位上的数字(即2) 打印…

优选算法系列(前缀和 _下) k

目录 五&#xff1a;和为 k 的子数组&#xff08;medium&#xff09; 题目链接&#xff1a;560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 代码&#xff1a; 六&#xff1a;和可被 K 整除的子数组&#xff08;medium&#xff09; 题目链…

mac m3 pro 部署 stable diffusion webui

什么是Stable Diffusion WebUI &#xff1f; Stable Diffusion WebUI 是一个基于Stable Diffusion模型开发的图形用户界面&#xff08;GUI&#xff09;工具。通过这个工具&#xff0c;我们可以很方便的基于提示词&#xff0c;描述一段文本来指导模型生成相应的图像。相比较通过…

OpenCV图像拼接(6)根据权重图对源图像进行归一化处理函数normalizeUsingWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::normalizeUsingWeightMap 是 OpenCV 中用于图像拼接细节处理的一个函数。它根据权重图对源图像进行归一化处理&#xff0c;通常用于…

23种设计模式-外观(Facade)设计模式

外观设计模式 &#x1f6a9;什么是外观设计模式&#xff1f;&#x1f6a9;外观设计模式的特点&#x1f6a9;外观设计模式的结构&#x1f6a9;外观设计模式的优缺点&#x1f6a9;外观设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是外观设计模式…

capl语言基础语法(二)

1.strncpy&#xff1a;将字符串复制到另一个字符串中。 输入&#xff1a; dest 是目标字符串。 src 是源字符串。 n 是要复制的最大字符数。 语法&#xff1a; char *strncpy(char *dest, const char *src, size_t n); 例子&#xff1a; strncpy(gStringRep,"",…

QLoRA和LoRA 微调

QLoRA 其实是一种结合了量化和 LoRA 微调技术的统一方法&#xff0c;而不是同时使用两种不同的微调方式。换句话说&#xff0c;QLoRA 的意思就是&#xff1a;先把大模型的主权重用低精度&#xff08;例如 4-bit&#xff09;量化&#xff0c;从而大幅减少存储需求&#xff1b;然…

Qt Concurrent 并发 Map 和 Map-Reduce

并发 Map 和 Map-Reduce QtConcurrent::map()会对容器中的每个项目应用一个函数&#xff0c;对项目进行就地修改。QtConcurrent::mapped() 类似于 map()&#xff0c;但它返回的是一个包含修改内容的新容器。QtConcurrent::mappedReduced() 类似于 mapped()&#xff0c;只不过修…

RT-Thread-线程管理

一、线程管理 RT_Thread线程管理主要是实现线程管理和调度&#xff0c;线程分为用户线程和系统线程。RT_Thread的线程调度器是抢占式的&#xff0c;寻找就绪状态最高优先级线程。 线程管理的API函数 创建线程函数 rt_thread_t rt_thread_create( const char *name, //线程名称 …

【CC2530 教程 十二】CC2530 Z-Stack 硬件抽象层

目录 一、硬件抽象层简介&#xff1a; &#xff08;1&#xff09;HAL 硬件抽象层是什么&#xff1f; &#xff08;2&#xff09;通俗易懂的解释&#xff1a; &#xff08;3&#xff09;具体例子&#xff1a; 二、硬件抽象层HAL&#xff1a; &#xff08;1&#xff09;HAL…

Linux如何判断磁盘是否已分区?

在 Linux 系统中&#xff0c;判断磁盘是否已分区可通过以下方法实现&#xff1a; 方法 1&#xff1a;使用 fdisk -l 命令 此命令会列出所有磁盘及其分区的详细信息&#xff1a; sudo fdisk -l输出解读&#xff1a; 若磁盘&#xff08;如 /dev/sdb&#xff09;下有类似 /dev/…