细说JavaScript函数(JavaScript函数详解)

函数的作用就是封装一段JavaScript代码,让开发者可以通古简单的方式使用这段代码
细说JavaScript函数(JavaScript函数详解)

一、函数的分类

在几乎所有的编程语言中,都有函数这一概念,并且没中语言本身都继承了丰富的函数,这类函数被称为系统函数或者内置函数,系统函数在语言设计时就已经定义好了,开发者根据语言的开发手册学习使用就可以
js的系统函数可以分为数学函数、时间函数、字符串函数等

二、自定义函数

自定义函数就是开发者自己定义的函数,其代码处理逻辑有开发者指定,用来满足项目开发中一些特性的需求

1、函数的创建

声明函数大致分为函数名、形式参数、函数体
函数名与标识符的定义规则一致
形式参数相当于一个占位符,不具有实际作用,它是可选的,和它对应的就是实际参数
函数体就是我们可以重复使用的代码,我们可以将重要的代码编写在其中,通常的情况下函数体中的return用于返回一个数据值,当然也可以单纯的执行一段语句。

// 函数定义语法
function 函数名(形式参数1,形式参数2,...形式参数n){
	语句;
	return 返回值;
}

// 例子
function demo(){
	var count = 0;
	for(var i=0;i<10;i++){
		count +=1;
	}
	return count;
}
2、函数的调用
// 函数调用的语法
函数名(实际参数1,实际参数2,...实际参数n);

// 注意:
// 函数在创建之后不会自动指定,只有在调用之后才会执行函数体中的语句,概括的说:不调用、不执行
3、函数的参数

参数就是用来让函数更灵活的,参数分为形式参数和实际参数,形式参数不具备实际值,仅仅作为占位符存在,用于函数体的语句中,实际参数具有实际值,在调用时会对形式参数进行一一对应赋值,然后被用于函数体的语句中

function demo(num){
	var count = 0;
	for(var i=0;i<num;i++){
		count+=i;
	}
	return count;
}

console.log(demo(10));

// 上述例子设置了形参num,当我们不传递实参时,num就没有被赋值,会默认undefined,在比较运算中会自动转换为数值0,当我们传递多个实参时,没有形参与之对应会默认被抛弃,程序都可以执行

// es6中可以给形参一个默认值
function demo(num =10){
	var count = 0;
	for(var i=0;i<num;i++){
		count += i;
	}
	return count;
}
4、返回值

对于函数外部而言,函数内部是不可见的,它们需要一种沟通机制,参数就是它们沟通的桥梁,通过参数外部语句可以传递不同的数据给函数处理,参数也是一种变量,但这种变量只能被函数内部的语句使用,并在函数调用时被赋值,除了参数返回值也是函数的组成部分,参数时外部语句对函数内部语句的信息传递,而返回值正好相反,和参数一样return语句并不是必要的,也许函数体内的语句只是想显示一句话而已,那就不需要返回值

三、函数的特殊类型

除一般函数外,函数具有多种特殊形式,下面我们就分别介绍一下

1、函数表达式

表达式最终会返回一个值,函数表达式返回的数值就是其本身,其格式与函数声明语句一致,只不过函数表达式可以将函数名省略

function(){
	函数体;
	return 返回值;
}
2、自执行函数
// 自执行函数就是在脚本执行时进行自动调用,自执行函数的创建步骤和执行步骤时一起进行的
// 而且仅在程序中执行一次,格式如下:
(function(参数1,参数2,...参数n){
	语句;
})([参数1,参数2,...参数n]);
// 自执行函数分为两个部分,第一对小括号内是一个匿名函数,第二对向括号内是传入的实参
3、回调函数
// 回调函数实质就是通过时间或函数被触发来执行的

<button onclick="clickButton()">按钮</button>
<script>
	function clickButton(){
		alert("您点击了按钮");
	}
</script>
4、递归函数
// 在js中递归函数的实现方式就是在函数体中调用其函数本身,也可以称为函数的自调用

// 实现10的阶乘 10x9x8x7x6x5x4x3x2x1
function jiecheng(num){
	if(num < = 1){
		return 1;
	}
	return num * jiecheng(num - 1);
}
console.log(num(10));
5、构造函数

构造函数经常被用于创建内置对象,比如创建一个字符串new String()、创建一个数组new Array()
它通常作为一种创建方式存在,但其实构造函数不仅仅是一种创建方式、也是一种初始化的方式

四、函数作用域

1、局部变量

在网页中js代码默认在全局作用域下,与之关联的对象就是window对象,当我们在创建函数时,函数就是一个局部作用域,与之关联的对象就是这个函数对象,创建一个函数相当于在全局作用域下开辟一块区域用作局部作用域,创建多个函数意味着创建了多个局部作用句,同时在函数中可以嵌套创建函数,这意味着在局部作用域下还可以拥有若干个局部作用域
在全局和局部作用域下声明的变量分别被称为全局变量和局部变量,它们存储在与作用域关联的对象中两者的区别:
1、在全局作用域下声明的变量具有全局性,在任意位置都可以获取,包括在局部作用域下
2、在局部作用域下声明的变量具有局部性,仅能在该作用域下使用,在全局作用域下无法使用
3、全局变量和局部变量同名时可共存

2、变量的访问机制
// 全局变量在任何位置都可以访问
var name = "知数SEO";
function demo(){
	alert(name);
}
demo();

// 上述例子中执行的步骤是:
// 第一步:寻找该作用域下的局部变量,若找到则返回对应值,否则回到上一级作用域下寻找
// 第二步:进入上一级作用域,寻找同名的变量,若找到返回对应的值,否则返回undefined
// 第三步:积蓄执行第二步,知道到达顶级作用域
3、变量的生命周期
// 局部变量仅能在局部作用域下使用
function demo(){
	var name = "知数SEO";
	console.log(name);
}
demo();
console.log(name);

// 函数最重要的一个特点就是不调用不执行
// 全局变量的生命周期较长,只有脚本结束或认为删除才会清除全局变量的内存占用
// 局部变量的生命周期较短,当函数执行时局部变量产生,函数执行完毕后局部变量会被回收,清空内存

五、闭包

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数)因而这些变量也是该表达式的一部分

通俗的讲,在js中每个函数都是一个闭包函数,因为函数生成了一个局部作用域,在局部作用域下可以声明一系列的变量、函数,同时可以在局部作用域下访问已声明的变量和函数,并且嵌套函数中服从作用域链的规则,而这种操作在 局部作用域外是无法实现的,那么这个由作用域范围定界,生成的一块保存若干变量和函数的数据包就可以称为一个闭包
闭包是将一些列变量和变量环境进行保存,是为了在外部访问到闭包中的变量

function demo(){
	var name = "知数SEO";
	return function(){
		alert(name);
	}
}
demo();

// 闭包的两个特性
// 一、可以读取局部变量
// 二、将值爆存在内存中(缺陷就是容易引发内存泄漏)

function add(){
	var count = 0; // 初始化局部变量
	return function(){
		return count++; // 局部变量累加1
	}
}
var getCount = add(); // 创建一个闭包
console.log(add());  // 结果为0
console.log(add());  // 结果为1
console.log(add());  // 结果为2

六、ES6函数新特性

1、rest参数

rest参数(形式为 …变量名)用于获取函数的多余参数,这样就不需要引入arguments
对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中

function add(...valuse){
	// 声明局部变量用于保存数值
	let num = 0;
	// 循环参数遍历数据
	for(var val in values){
		sum += val;
	}
	// 返回总和
	return sum;
}
// 调用函数

var num = add(2,3,4);
console.log(num); // 输出 9 

// 需要注意的是rest函数之后不能再有其他参数(只能是最后一个参数),否则会报错
2、箭头函数
// 在ES6中允许使用肩头=>定义函数

var f = v=>v;
//等同于
var f = function(v){
	return v;
}

// 如果箭头函数不需要参数
var f = ()=>5;
//等同于
var f = function(){
	return 5;
}

// 如果箭头函数需要多个参数
var f = (num1,num2)=>num1+num2;
// 等同于
var f = function(num1,num2){
	return num1 + num2;
}

// 箭头函数的代码块部分多于一条语句就需要使用大括号将它们括起来
var f = (num1,num2){
	return num1 + num2;
}

// 由于大括号解释为代码块,所以如果箭头函数直接返回一个对象,则必须在对象外面加上括号
var f = id=>({name:"知数SEO"});

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue:使用【3.0】:条件模块

一、条件层级效果图 二、代码 <template><ContentWrap><!-- 添加条件分支:level1 --><div class"btnBox" v-if"isEdit"><el-button type"primary" click"add">添加条件分支</el-button></div…

YOLOv8改进 | 细节涨点篇 | UNetv2提出的一种SDI多层次特征融合模块(分割高效涨点)

一、本文介绍 本问给大家带来的改进机制是UNetv2提出的一种多层次特征融合模块(SDI)其是一种用于替换Concat操作的模块,SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。该方法已在多个公开的医学图像分割数据集上进行了验证,包括皮…

HANA:传参,游标(Cursor)应用,FOR循环,解决存储表内存溢出的问题

作者 idan lian 如需转载备注出处 1.应用场景 最近项目上用HANA开发的比较多&#xff0c;之前我是bw用的比较多&#xff0c;就不会有这种问题。我们这个项目很多都是开发的计算视图&#xff0c;但最近做acdoca的逻辑时&#xff0c;计算视图在生产环境执行的时候报错&#xf…

阿里巴巴分拆业务板块,中台架构已经死了吗?

阿里巴巴集团董事会主席兼首席执行官张勇发布全员信&#xff0c;宣布启动“16N”组织变革。在阿里巴巴集团之下&#xff0c;将设立阿里云智能、淘宝天猫商业、本地生活、菜鸟、国际数字商业、大文娱等六大业务集团和多家业务公司。 业务集团和业务公司分别成立董事会&#xff…

基于电源完整性的一些PCB设计建议

基于电源完整性的一些PCB设计建议 1. 尽量减少电源和地通路之间的环路电感&#xff0c;在相邻的层上分配电源和接地面时&#xff0c;使用尽可能薄的电介质&#xff1b; 2. 通过在平面之间使用尽可能高的介电常数来获得平面之间的最低阻抗&#xff0c;与尽可能薄的介电常数设计…

深入理解 Flink(七)Flink Slot 管理详解

1.JobMaster 注册成功之后开始调度 JobMaster 中封装了一个 DefaultScheduler&#xff0c;在 DefaultScheduler.startSchedulingInternal() 方法中生成 ExecutionGraph 以执行调度。 2.Flink 的资源管理机制 资源调度的大体流程如下&#xff1a; a.TaskExecutor 注册 Reg…

从CISC到RISC-V:揭开指令集的面纱

对于大多数同学来说&#xff0c;计算机或智能手机的运行似乎就像魔法一样神奇。你可能知道它们内部都是一些复杂的电子组件&#xff0c;比如CPU、内存等等&#xff0c;但这些组件是如何协同工作&#xff0c;让我们可以在电脑上打字&#xff0c;或者在手机上看视频呢&#xff1f…

matplotlib绘制动态瀑布图

绘制瀑布图思路&#xff1a;遍历指定文件目录下所有的csv文件&#xff0c;每读一个文件&#xff0c;取文件前20行数据进行保存&#xff0c;如果超过规定的行数300行&#xff0c;将最旧的数据删除&#xff0c;仅保留300行数据进行展示。 网上找的大部分绘制瀑布图的代码&#x…

ssh远程登录协议 搞定远程访问控制

远程管理linux系统基本上都要使用到ssh&#xff0c;原因很简单&#xff1a;telnet、FTP等传输方式是以明文传送用户认证信息&#xff0c;本质上是不安全的&#xff0c;存在被网络窃听的危险。SSH&#xff08;Secure Shell&#xff09;目前较可靠&#xff0c;是专为远程登录会话…

走迷宫(c语言)

前言&#xff1a; 制作一个迷宫游戏是一个有趣的编程挑战。首先&#xff0c;我们需要设计一个二维数组来表示迷宫的布局&#xff0c;其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来&#xff0c;我们需生成迷宫。在生成迷宫的过程…

智能手表喇叭无气孔导致老化播放后没声音

智能音箱喇叭老化播放后没声音 智能手表要做防水&#xff0c;在外壳上打了防水胶&#xff0c;结果出现播放突然没声音的现象&#xff0e; 原因 一直播放&#xff0c;设备温度升高&#xff0c;因为做了防水密闭导致喇叭腔体气压异常&#xff0c;导致播放没声音&#xff0e; …

nginx入门学习

nginx简介 nginx 是什么?用来干嘛的 通俗解释&#xff1a;客户端向服务器请求时&#xff0c;提供让多个服务器一起处理请求的东西 是一个反向代理服务器&#xff0c;能够提供负载均衡&#xff0c;和进行反向代理的功能 正向代理&反向代理 客户端向代理服务器请求&#…

短剧分销系统,助力短剧市场发展,实现短剧收益

近几年来&#xff0c;我国短剧兴起&#xff0c;在经过几年的蓄力后迎来了爆发期&#xff0c;短剧市场规模一路狂飙&#xff01;短剧拥有节奏快、剧情“爽”的优势&#xff0c;成功占领了各大观众的碎片化时间&#xff0c;短剧已经成为了影视行业的新力量&#xff0c;也成为了当…

微服务概述之微服务特性

前言 既然系统采用了微服务架构&#xff0c;就需要了解一些微服务的特性&#xff0c;这样在进行微服务开发时&#xff0c;脑海中才会有一些指导方向。微服务具有以下特性。 1. 服务组件化 组件是独立、可替换、可升级的软件的单元。将整体应用拆分成独立的服务组件后&#xff…

嵌入式软件开发对硬件知识的掌握要求要多高?

嵌入式软件开发对硬件知识的掌握要求要多高&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff0…

并发编程(一)线程基础知识与线程控制

进程与线程 进程&#xff1a;如任务管理器中各种程序叫做正在运行的进程。对于操作系统来说&#xff0c;仅仅是一个数据结构&#xff0c;并不真实的执行代码 线程&#xff1a;真实执行代码的 每个进程启动的是时候会同步启动一个主线程即main函数&#xff0c;当main函数结束…

倒F天线设计经验分享

一、IFA天线理论分析 为了改善&#xff29;&#xff2c;&#xff21;天线难以使用的缺点&#xff0c;在&#xff29;&#xff2c;&#xff21;天线的基础上再增加一个倒L结构&#xff0c;形成IFA天线&#xff0c;此种天线体积小、易于匹配并具有双极化的特点&#xff0c;而在蓝…

帆软报表11.0.19增加postgres数据源方案

项目使用postgres数据库&#xff0c;帆软报表集成开发时需要手工增加该数据源。 https://help.fanruan.com/finereport/doc-view-2563.html 但增加数据源后测试报告无此驱动&#xff0c;经查看文档&#xff0c;现在是通过驱动管理来上传&#xff0c; 但新版又不允许上传驱动JAR…

外贸群发邮件最好的软件?群发软件哪个好?

外贸开发信群发软件推荐&#xff1f;做外贸用什么邮件群发软件&#xff1f; 在外贸业务中&#xff0c;与潜在客户建立联系并保持沟通是至关重要的。那么&#xff0c;如何快速有效地发送邮件给大量的潜在客户呢&#xff1f;这就涉及到了外贸群发邮件。蜂邮EDM来探讨一下&#x…

presto/trino 入门介绍实战

引言 Presto是一款分布式SQL查询引擎&#xff0c;它能够在大规模数据集上实现快速、交互式的查询。本文将介绍Presto的基本概念并结合一些实际的代码示例&#xff0c;能够让的大家快速入门并在实际项目中应用。 官网&#xff1a;Launch Presto: Local download, JDBC, Docker…