【JavaScript】深入了解 JavaScript 函数

序言

在 JavaScript 中,函数是一种强大的工具,它允许我们封装代码、实现逻辑复用,并且在需要时进行调用。本文将深入探讨 JavaScript 函数的各个方面,包括定义函数、函数调用、返回值、作用域、参数以及 ES6 中的箭头函数等内容。

一、函数的定义

在 JavaScript 中,可以使用 function 关键字来定义函数。函数可以有参数,也可以没有参数。

function sayHello() {console.log("Hello!");
}function greet(name) {console.log("Hello, " + name + "!");
}

二、函数表达式

函数表达式是指将函数赋值给变量,或者将函数作为值传递给其他函数的过程。函数表达式可以是匿名的,也可以是具名的。

// 匿名函数表达式
let myFunction = function() {console.log('I am anonymous');
};// 具名函数表达式
let myNamedFunction = function namedFunction() {console.log('I am named');
};

三、函数的调用

在 JavaScript 中,函数可以通过多种方式进行调用,包括普通函数调用、方法调用、构造函数调用以及间接调用。

function myFunction() {console.log('Hello, world!');
}// 普通函数调用
myFunction();const obj = {myMethod: myFunction
};
// 方法调用
obj.myMethod();// 构造函数调用
const instance = new myFunction();const anotherFunction = function(func) {func();
};
// 间接调用
anotherFunction(myFunction);

四、返回值

函数可以返回一个值,我们可以使用 return 语句来指定返回值。如果没有 return 语句,函数将返回 undefined

function add(a, b) {return a + b;
}let result = add(3, 5);
console.log(result); // 输出 8

五、作用域

JavaScript 中的函数具有作用域,即变量在函数内外的可访问性。函数可以访问其父级作用域中的变量。

let globalVar = "I'm global";function myFunction() {console.log(globalVar); // 可访问全局变量
}myFunction();

六、函数参数

JavaScript 中的函数可以接收任意数量的参数,并且可以通过函数调用时传入的参数来执行不同的操作。如果调用函数时传入的参数比函数声明时定义的参数多,那么这些额外的参数将被忽略。

function add(a, b) {return a + b;
}console.log(add(2, 3)); // 输出 5
console.log(add(2, 3, 4)); // 输出 5(多余的参数被忽略)

七、箭头函数

ES6 引入了箭头函数,它是一种更简洁的函数语法。它使用 => 语法,来分隔函数的参数和函数体,通常更易于阅读。

// 普通函数
function add(a, b) {return a + b;
}// 箭头函数
let add = (a, b) => {return a + b;
};

7.1 省略大括号和 return

如果函数体只有一条语句,并且是一个返回语句,可以省略大括号和 return 关键字。

let add = (a, b) => a + b;

7.2 箭头函数与 this

箭头函数的另一个重要特性是它没有自己的 this 关键字,而是继承父级作用域中的 this。这意味着在箭头函数内部,this 的值与包含箭头函数的常规函数的 this 值相同。

const obj = {name: "zs",sayHello: function() {setTimeout(() => {console.log("Hello, " + this.name); // 在箭头函数内部,this 指向 obj 对象}, 1000);}
};obj.sayHello(); // 输出 "Hello, zs"(1秒后)

推荐阅读

  1. 深入理解 JavaScript 中的 Promise、async 和 await
  2. 探索生产者/消费者模式:解决并发编程中的资源竞争
  3. 深入探究 Spring Boot Starter:从概念到实践
  4. RBAC 权限设计(五)
  5. Docker Compose:简化多容器应用部署

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

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

相关文章

Vue3+Element+TS动态菜单+按钮权限控制实现探索

1.动态获取权限并根据获取权限转换成相对应的router 根据请求获取菜单数据,对菜单数据进行转换,分别进行下面几步: /*** 组件地址前加斜杠处理*/ export function addSlashToRouteComponent(routeList: AppRouteRecordRaw[]) {routeList.fo…

如何创建族表

https://jingyan.baidu.com/article/c275f6bafa5714a23c756768.html

五角钱的程序员 | Kafka 是什么?

本文来源公众号“五角钱的程序员”,仅用于学术分享,侵权删,干货满满。 原文链接:Kafka 是什么? 你是一个程序员,假设你维护了两个服务 A 和 B。B 服务每秒只能处理 100 个消息,但 A 服务却每秒…

数据结构·一篇搞定栈!

好久不见,超级想念 废话不多说,直接看 引言 在数据结构的大家族中,栈(Stack)是一种非常重要的线性数据结构,它的特点是后进先出(LIFO,Last In First Out)。栈在程序设…

Echarts旭日图的配置项,强大的层级关系展示图表。

ECharts中的旭日图(Sunburst Chart)是一种数据可视化图表,用于展示层级关系数据。它通常用于呈现树状结构或层级结构的数据,例如组织结构、文件目录结构、地理区域层级等。 旭日图通过圆形的方式展示数据的层级结构,每…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout 文章编号&…

算法day01

1、[283.移动零](https://leetcode.cn/problems/move-zeroes/) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 解题思路: 双指针…

Redis——入门简介

Redis,全称为Remote Dictionary Server,即远程字典服务,是一个开源的、内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件,具备出色的读写性能和丰富的功能特性。以下是对Redis的入门简介: 一、Redis的主…

LVM逻辑卷管理之快照 —— 筑梦之路

简介 LVM快照是LVM提供的一个强大功能,它允许我们在不中断服务的情况下捕获逻辑卷在某个时间点的状态,从而进行备份、恢复或测试等操作。LVM快照是一个特殊的逻辑卷,它保存了原始逻辑卷在某个时间点的数据镜像。快照使用写时复制&#xff08…

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是? 实际利润目标利润(目标成本-实际成本)*卖方分担比例 解:10 000(100 000 - 90 000)* 0.2 12 000(元) 实际成本有时也写作最终成本,问承…

Ubuntu 24.04 LTS 安装 touchegg 开启触控板多指手势

文章目录 〇、概述一、安装 touchegg二、安装 gnome-shell 扩展 X11 Gestures三、安装可视化配置工具 touche 〇、概述 之前为了让笔记本支持多指手势,我安装的是 fusuma,安装教程详见 这篇文章 ,考虑到 fusuma 安装过程繁琐且不支持可视化配…

Qt自定义控件--提升为

为什么要自定义控件 1,有复合小控件需要组合为一个整体控件时; 2,一个复合控件需要重复使用时; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1,在主控件选择和子控件所有控件所在控件…

linux 设备驱动支持多个设备写法

compatible “aaa,bbb” 当一个驱动支持多个设备的时候,在每个设备的dts中,都会配置各自的compatible,当与driver中的compatible匹配后,会取各自的data。在 __of_match_node中有match。 Example1 static const struct of_devi…

Docker与Consul:构建动态服务发现与更新的微服务体系

Docker和Consul是构建微服务体系中常用的工具之一,它们可以协同工作来实现动态服务发现和更新。下面是一个简单的Java微服务体系的示例,使用Docker容器和Consul进行服务的注册、发现和更新。 1. 创建一个简单的Java微服务 首先,我们创建一个…

1.4. 离散时间鞅-鞅的Lp收敛,鞅与停时 (2)

鞅的L^p收敛p > 1,鞅与停时 鞅的L^p收敛(p > 1),鞅与停时2. 极大值不等式2.1. Doob不等式-时间有界2.2. L p L^{p} L

MySQL主从切换测试

测试主从高可用 确认mha正常运行中ps -ef | grep mha #一般在kde-offline3节点 mysql 166898 1 1 17:54 pts/0 00:00:00 perl /bin/masterha_manager --conf=/data/apps/mha4mysql-manager-0.58/app13306.cnf --ignore_last_failover 如果未启动则需要手动执行mha…

数据结构之----栈与队列

栈是限定仅在表尾进行插入和删除操作的线性表; 队列是只允许在一端进行插入操作,而另一端进行删除操作的线性表; 栈,允许插入和删除的一端称为栈顶,另一端称为栈底,特点后进先出。 插入操作称为进栈&#…

【全网首发】大模型入门、概念详解、综述

大模型教程 注NLP入门、大模型入门、NLP发展、NLP四范式、综述入门必读图像相关大模型相关微调相关多模态相关其他注 多数文章博主已经读完,有中文笔记、代码、私信博主领取也可以相互交流学习。笔记写在flowus中会逐渐迁移到博客。 NLP入门、大模型入门、NLP发展、NLP四范式…

for box,score,cat in zip(xywhboxes,scores,cats):

zip()函数可以将多个可迭代对象打包成一个元组序列,这些对象的元素会一一对应,例如: a [1, 2, 3] b [a, b, c] c zip(a, b) print(list(c)) 输出为 [(1, a), (2, b), (3, c)] for循环中的zip()函数将它们打包成一个元组序列&#xff0…

Android中C++如何读写json文件

我们需要在json文件中记录一下总数,文件格式如下: [{"total_count":0,"total_count1":0,"total_count2":0,"total_count3":0,"total_count4":0}] 目录 1. Android.bp中新增 2. 头文件添加 3. 向jso…