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

详解js在事件中,如何传递复杂数据类型(数组,对象,函数)

文章目录

  • 前言
  • 一、何谓预编译,变量提升?
  • 二、复杂数据类型的传递
    • 1.数组
    • 2.对象
    • 3.函数
  • 总结


前言

在JavaScript这门编程语言学习中,如何传参,什么是变量提升,js代码预编译等等。要想成为一名优秀的js高手,这些内容是你不得不去认真研究和深挖的。今天我们就来具体看看这几件事,它到底是怎么回事儿。


一、何谓预编译,变量提升?

其实这一概念是javaScript非常基础而本质的内容,通过对一门编程语言 底层封装的一些内容、概念的深入研究。我们可以逐步接近语言的逻辑,本源,也能更好的理解编译这门语言的人当时的思路,这也算是跨越时空的对话了。

在js代码执行之前,会有一段时间。这段时间是用来给js代码做准备的。那么这段时间,我们称之为预编译时间。 而这段预编译时间,编译器干的最重要的事情就是给js代码进行变量提升,函数提升,以及形参实参的统一

换句话说,女孩子出门游玩之前会有一段时间,这段时间是用来给她自己出去游玩做准备的。这段时间发生的最重要的事就是,化妆,换衣服等等。

 预编译期间会将变量声明和函数声明提升到对应作用域的最顶端,只提升声明,不提升值!

如果是全局变量,则提升到全局作用域最顶端。如果是局部的变量,则提升到局部作用域的最顶端。

eg1:

	    oo();function oo(){	console.log(`oo`);}// 此函数为普通函数,这样的函数预解析时有函数提升,所以可以在函数声明之前调用// 如果是下面这种写法,则预解析时,会被转化成上面这样,function oo(){	console.log(`oo`);}oo();

eg2:

		var a = function(){console.log(`哈哈`);}a();// 函数表达式,只能在声明之后调用// 如果是var声明的函数表达式,具有变量提升的特点.但是只会返回undefined,因为只提升声明,不提升值// 如果是let,const声明的函数表达式,则不具备变量提升的特点.这是var特有的// 如果是上面这种写法,则预解析会被转化成下面这样var a;a = function(){console.log(`哈哈`);}a();

我相信js预解析,以及函数提升,变量提升到这应该是说明白了


二、复杂数据类型的传递

本人上一篇博客已经非常详细的解释了形参,实参,以及简单数据的传参。今天看看复杂数据类型的传递。

传参实质就是传实参给形参,最终让形参等于实参即可,形参用来接收实参的值,如此而已。

1.数组

代码如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><div onclick="fun([1,2,'hh'],[45,'',47])">兔年大吉</div><script>var a = 1;var b =8;function fun(a,b){console.log(a,b);}fun(a,b); fun(3);</script></body>
</html>

以上代码,我们是将数组[1,2,'hh'],[45,'',47]作为参数,进行传递的。

那么对应的a=[1,2,'hh'],而b=[45,'',47]

这个以数组作为参数传递,只有在点击的时候才会执行

另外一个问题就是,此函数被调用了两次,在不点击调用的情况下,自执行两次。

第一次执行fun(a,b)输出结果为1   8

此时a,b作为形参,而形参a,b两个变量被声明且赋值了,相当于初始化,分别给了a,b一个值,因此打印出来1   8

第二次执行fun(3)  输出结果为   3     undefined

这是因为,此时3作为实参,传给形参(a,b),但形参只有一个,而实参有两个。所以相当于给a赋值为3,b只声明未赋值,为undefined

 总结:

  • 形参和实参是一一对应关系,如同映射
  • 当实参个数等于形参个数,则输出正确结果
  • 当实参个数多于形参个数,只取形参个数
  • 当实参个数小于形参个数,多出的形参只声明未赋值,属于未定义

 

2.对象

代码如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><div onclick="fn({name:'张三'})">法外狂徒</div><script>function fn(n){console.log(n);}</script></body>
</html>

这个就是点击事件以对象作为实参,进行传参的

当点击div以后,n={name:“张三”},这是一种变量赋值操作,只不过n没有被声明罢了

 

3.函数

这里我要重点说明一下

 上面这两种写法,是完全不一样的,

A盒子表示将函数fk()的值作为参数进行传参

B盒子表示将函数fk作为参数进行传参

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><div onclick="fm(fk())" >哈哈哈</div><div onclick="fm(fk)" >哈哈哈</div><script>function fk(){console.log(3);return 10;}function fm(result){	console.log(result);console.log( typeof result);							fk()															result()console.log( result.prototype === fk.prototype );}</script>	</body>
</html>

 第二个div,在这里将fk函数作为实参进行传参的时候,本质上fk是一个变量;

fk() = result();

result作为形参相当于一个声明,利用变量名调用函数;

result相当于   var  result = function fk(){};


总结

  • js预解析是非常重要的,这里面注意var与const和let的区别
  • 以数组,对象等数据类型传参,记得注意参数之间存在一一对应关系
  • 可以在调用函数的时候,把括号里面的内容看作实参,但本质上是变量。函数本身有时候也可以理解为未声明的变量,但这仍然需要深度思考。函数是怎么传的,怎么执行的。文章只能给大家作为参考,最重要还是要自己深度思考。

创作不易,如果对你有帮助,希望不吝一键三连。

相关文章:

详解js在事件中,如何传递复杂数据类型(数组,对象,函数)

文章目录 前言一、何谓预编译&#xff0c;变量提升&#xff1f;二、复杂数据类型的传递 1.数组2.对象3.函数总结前言 在JavaScript这门编程语言学习中&#xff0c;如何传参&#xff0c;什么是变量提升&#xff0c;js代码预编译等等。要想成为一名优秀的js高手&#xff0c;这些内…...

高并发架构 第一章大型网站数据演化——核心解释与说明。大型网站技术架构——核心原理与案例分析

大型网站架构烟花发展历程1.1.1初始阶段的网站构架1.1.2应用服务和数据服务分离1.1.3使用缓存改善网络性能1.1.4使用应用服务器集群改善网站的并发处理能力1.1.5数据库读写分离1.1.6使用反向代理和cdn加速网站相应1.1.1初始阶段的网站构架 大型网站都是由小型网站一步步发展而…...

VPP接口INPUT节点运行数据

在设置virtio接口接收/发送队列函数的最后&#xff0c;更新接口的运行数据。 void virtio_vring_set_rx_queues (vlib_main_t *vm, virtio_if_t *vif) { ...vnet_hw_if_update_runtime_data (vnm, vif->hw_if_index); } void virtio_vring_set_tx_queues (vlib_main_t *vm,…...

RabbitMQ学习(九):延迟队列

一、延迟队列概念延时队列中&#xff0c;队列内部是有序的&#xff0c;最重要的特性就体现在它的延时属性上&#xff0c;延时队列中的元素是希望 在指定时间到了以后或之前取出和处理。简单来说&#xff0c;延时队列就是用来存放需要在指定时间内被处理的 元素的队列。其实延迟…...

TCP并发服务器(多进程与多线程)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 TCP并发服务器&#xff08;多进程与多线程&#xff09;1. 多进程并发服务器&#xff08;1&#xff09;…...

第1章 Memcached 教程

Memcached是一个自由开源的&#xff0c;高性能&#xff0c;分布式内存对象缓存系统。 Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素…...

【2022.12.9】Lammps+Python 在计算g6(r)时遇到的问题

目录写在前面绘制g6( r )执行步骤【updated】如何检查图像的正确性&#xff1a;不是编程问题&#xff0c;而是数学问题的一个小bug废稿2则&#xff1a;写在前面 全部log&#xff1a; 【2022.11.16】LammpsPythonMATLAB在绘制维诺图时遇到的问题 绘制g6( r )执行步骤【updated…...

MySQL使用C语言连接

文章目录MySQL使用C语言连接引入库下载库文件在项目中使用库使用库连接数据库下发SQL请求获取查询结果MySQL使用C语言连接 引入库 要使用C语言连接MySQL&#xff0c;需要使用MySQL官网提供的库。 下载库文件 下载库文件 首先&#xff0c;进入MySQL官网&#xff0c;选择DEVEL…...

JavaScript随手笔记---比较两个数组差异

&#x1f48c; 所属专栏&#xff1a;【JavaScript随手笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…...

【C++修炼之路】21.红黑树封装map和set

每一个不曾起舞的日子都是对生命的辜负 红黑树封装map和set前言一.改良红黑树的数据域结构1.1 改良后的结点1.2 改良后的类二. 封装的set和map2.1 set.h2.2 map.h三. 迭代器3.1 迭代器封装3.2 const迭代器四.完整代码实现4.1 RBTree.h4.2 set.h4.3 map.h4.4 Test.cpp前言 上一节…...

下载ojdbc14.jar的10.2.0.1.0版本的包

一、首先要有ojdbc14.jar包 没有的可以去下载一个&#xff0c;我的是从这里下载的ojdbc14.jar下载_ojdbc14.jar最新版下载[驱动包软件]-下载之家&#xff0c; 就是无奈关注了一个公众号&#xff0c;有的就不用下了。 二、找到maven的本地仓库的地址 我的地址在这里D:\apach…...

关于欧拉角你需要知道几个点

基础理解&#xff0c;参照&#xff1a;https://www.cnblogs.com/Estranged-Tech/p/16903025.html 欧拉角、万向节死锁&#xff08;锁死&#xff09;理解 一、欧拉角理解 举例讲解 欧拉角用三次独立的绕确定的轴旋转角度来表示姿态。如下图所示 经过三次旋转&#xff0c;旋…...

git ssh配置

ssh配置 执行以下命令进行配置 git config --global user.name “这里换上你的用户名” git config --global user.email “这里换上你的邮箱” 执行以下命令生成秘钥&#xff1a; ssh-keygen -t rsa -C “这里换上你的邮箱” 执行命令后需要进行3次或4次确认。直接全部回车就…...

Linux进程概念(三)

环境变量与进程地址空间环境变量什么是环境变量常见环境变量环境变量相关命令环境变量的全局属性PWDmain函数的三个参数进程地址空间什么是进程地址空间进程地址空间&#xff0c;页表&#xff0c;内存的关系为什么存在进程地址空间环境变量 什么是环境变量 我们所有写的程序都…...

新手福利——x64逆向基础

一、x64程序的内存和通用寄存器 随着游戏行业的发展&#xff0c;x32位的程序已经很难满足一些新兴游戏的需求了&#xff0c;因为32位内存的最大值为0xFFFFFFFF&#xff0c;这个值看似足够&#xff0c;但是当游戏对资源需求非常大&#xff0c;那么真正可以分配的内存就显得捉襟…...

虚幻c++中的细节之枚举类型(enum)

文章目录前言一、原生c的枚举类型关键字classint8 - 枚举的基础类型&#xff08;underlying type&#xff09;二、枚举类型的灵活运用位运算枚举循环遍历三、虚幻风格的枚举类型UENUMUMETATEnumAsByte总结前言 虚幻引擎中的代码部分实现了一套反射机制&#xff0c;为c代码带了…...

判断某个字符串在另一个字符串中的个数

/** * 用于判断字符串中字符的个数 * * param str1 原字符串 * param str2 需要判断的字符 * return 返回有几个 */ private int getCount(String str1, String str2) { //获取两个字符串的长度 int oneLength str1.length(); int toLength str2.length(); //定义两个整数&am…...

测试人员如何运用好OKR

在软件测试工作中是不是还不知道OKR是什么?又或者每次都很害怕写OKR?或者总觉得很迷茫&#xff0c;不知道目标是什么? OKR 与 KPI 的区别 去年公司从KPI换OKR之后&#xff0c;我也有一段抓瞎的过程&#xff0c;然后自己找了两本书看&#xff0c;一本是《OKR工作法》&#xf…...

CentOS7 Hive2.3.9 安装部署(mysql 8.0)

一、CentOS7安装MySQL数据库 查询载mariadb rpm -qa | grep mariadb卸载mariadb rpm -e --nodeps [查询出来的内容]安装wget为下载mysql准备 yum -y install wget在tools目录下执行以下命令&#xff0c;下载MySQL的repo源&#xff1a; wget -P /tools/ https://dev.mysql.…...

【PTA Advanced】1142 Maximal Clique(C++)

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique …...

物流调度乱、单据处理难?实测实在Agent,物流企业数智化转型的“数字员工”天花板

摘要 站在2026年4月这个AI Agent商业化爆发的节点&#xff0c;物流行业正经历从“经验驱动”向“智能体自主决策”的范式转移。尽管数字化转型已喊了多年&#xff0c;但大量物流企业仍深陷系统孤岛、人肉搬运数据、信创适配难等隐形泥潭&#xff0c;传统RPA或API集成方案在面对…...

FFmpeg drawtext滤镜进阶:除了时间水印,你还能用它玩出什么花样?(动态文本+多位置叠加)

FFmpeg drawtext滤镜进阶&#xff1a;动态文本与多位置水印的创意实践 在视频处理领域&#xff0c;水印不仅是版权保护的标配工具&#xff0c;更是内容创作者展示品牌个性的画布。传统的时间戳水印早已无法满足专业用户的需求——想象一下&#xff0c;在直播流中实时显示股票行…...

【 技术方案设计】复杂分布式系统统一日志Trace平台 + 用户行为打点分析平台

前端+后端(分布式应用有 fastapi, springboot 等应用)系统,要做一个统一日志 trace 平台,并对用户行为日志做打点分析。给我一个详细的技术方案设计 + 数据存储 + 前后端 sdk + 接口 API 设计 统一日志Trace平台 + 用户行为打点分析平台 技术方案设计 文章目录 统一日志Tr…...

导丝磨床厂家信息分享6

行业痛点分析医疗导丝制造领域正面临三大核心挑战&#xff1a;脑血管介入场景要求导丝芯轴远端直径≤0.05mm且锥度过渡误差&#xff1c;0.001mm&#xff0c;测试显示传统设备加工良率不足65%&#xff1b;CTO闭塞病变导丝需实现0.014″至0.009″的精准缩径&#xff0c;数据表明行…...

快速上手:GLM-4-9B-Chat-1M超长上下文模型部署与调用教程

快速上手&#xff1a;GLM-4-9B-Chat-1M超长上下文模型部署与调用教程 1. 认识GLM-4-9B-Chat-1M模型 1.1 什么是GLM-4-9B-Chat-1M GLM-4-9B-Chat-1M是智谱AI推出的最新一代开源对话模型&#xff0c;特别针对超长上下文场景进行了优化。这个模型的核心特点是支持高达1,000,000…...

老程序员重归CSDN:AI时代的五重叩问与一封给未来的信

深夜&#xff0c;我重新登录了那个尘封已久的CSDN账号。上一次更新还是三年前&#xff0c;记录的是某个深夜排查分布式锁问题的碎片。如今&#xff0c;当AI能一键生成完整模块、自动修复基础Bug时&#xff0c;我却在思考一个更本质的问题&#xff1a;我们这些与代码相伴近二十年…...

手把手教你用通义千问3-VL-Reranker-8B:从安装到实战,小白也能做智能搜索

手把手教你用通义千问3-VL-Reranker-8B&#xff1a;从安装到实战&#xff0c;小白也能做智能搜索 1. 为什么你需要这个多模态重排序器 想象一下&#xff0c;你在管理一个大型电商平台。用户搜索"红色连衣裙"&#xff0c;结果返回了500个商品。传统的搜索引擎只能根…...

自动化内容创作:OpenClaw+Qwen3.5-9B批量处理游记照片生成博客

自动化内容创作&#xff1a;OpenClawQwen3.5-9B批量处理游记照片生成博客 1. 为什么需要自动化内容创作流水线 去年夏天我从西藏旅行回来&#xff0c;手机里存了800多张照片。当我坐在电脑前准备写游记时&#xff0c;面对海量素材突然感到无从下手——每张照片都需要回忆拍摄…...

【 Postman 使用教程】

一、接口测试介绍 1. 接口分类&#xff1a; 内部接口&#xff1a;系统内部各功能模块之间的接口&#xff08;测试比较详细&#xff09;外部接口&#xff1a;系统与外部系统之间的接口&#xff08;测试基本功能&#xff09; 2. 接口测试的重点&#xff1a; 测试接口数据交换是否…...

Verilog实战:手把手教你实现8B/10B编码与解码(附完整代码)

Verilog实战&#xff1a;从零构建8B/10B编解码器的工程化实现 在高速串行通信领域&#xff0c;数据完整性如同精密钟表的齿轮咬合——任何微小的时序偏差都可能导致整个系统崩溃。8B/10B编码技术正是解决这一痛点的关键钥匙&#xff0c;它通过精心设计的编码规则&#xff0c;确…...