js函数声明和函数表达式的理解

news/2025/10/23 16:56:41/文章来源:https://www.cnblogs.com/IwishIcould/p/19161085

什么是函数声明

以 function 关键字开头,必须指定函数名(如 function greet() {}),且不能作为其他语句的一部分。‌‌

函数声明会被提升

在JS中,函数声明会被提升,这意味着函数可以在声明之前被调用。
当你使用函数声明的方式定义函数: function resizeFn() {...}
整个函数声明会被提升到作用域的顶部。
这意味着在整个作用域内,无论函数在何处声明,都可以在声明前调用。

函数声明会被提升的代码解释

// 因为是函数声明,所以可以在函数声明之前调用。可以正常调用
resizeFn(); // 因为这是一个函数声明。
function resizeFn() {// 函数体
}

函数表达式

‌函数表达式‌:将函数赋值给变量,函数可匿名或具名
如 const sayHello = function() {}
或 const sayHello = function named() {}
函数表达式适用于赋值、参数传递等场景。‌‌
函数表达式‌:仅变量名被提升,函数体不会提升。
函数表达式:必须先定义后使用(也就是说在使用[调用]前,必须先定义)

函数表达式:必须先定义后使用

sayHello()
const sayHello = function() {} 

image
报错:Uncaught ReferenceError: Cannot access 'sayHello' before initialization

总结:看了上面的函数声明和函数表达式,也许你对函数声明和函数表达式有一定的理解了。
我们来看下面这个,函数表达式一定必须是:先定义后使用嘛?

函数表达式一定是先定义后使用嘛?

mounted () {this.myChart = echarts.init(this.$refs.chartContainer)const chartContainerElement = this.$refs.chartContainerconst resizeObserver = new ResizeObserver(() => {// 先使用了resizeFn()})// 后定义了const resizeFn = this._.debounce(() => {this.myChart && this.myChart.resize()}, 500)chartContainerElement && resizeObserver.observe(chartContainerElement)this.$once('hook:beforeDestroy', () => {resizeObserver.disconnect()})
}

我们的函数表达式 const resizeFn。
目前是:先使用后定义,那么在运行的时候会报错吗?
答案是:不会的。
因为:这里有一个重要的执行时机差。实际上在调用前,已经被定义了。
我们被代码的先后顺序给误导了。
并不是说:定义函数表达式的代码必须要写在函数调用之前。

  1. 异步执行时机
const resizeObserver = new ResizeObserver(() => {resizeFn()  // 这里不会立即执行!
})

关键点:ResizeObserver 的回调函数不是立即执行的,而是在元素尺寸变化时异步触发的。

  1. 代码执行顺序
// 步骤1:定义 ResizeObserver的 回调(此时只是定义,不执行)
const resizeObserver = new ResizeObserver(() => {resizeFn()  // 此时 resizeFn 还未定义,但不会报错,因为函数没有立即调用
})// 步骤2:定义  resizeFn ( 在执行任何 resize 事件前已经定义完成)
const resizeFn = this._.debounce(() => {this.echart_alarm && this.echart_alarm.resize()
}, 500)// 步骤3:开始观察(此时 resizeFn 已经存在)
chartContainerElement && resizeObserver.observe(chartContainerElement)

时间线说明

时间点:
t0: 定义 ResizeObserver 回调函数
t1: 定义 resizeFn 函数表达式  
t2: 开始观察元素尺寸变化
t3: 用户操作导致元素尺寸变化(此时才真正调用 resizeFn)

尾声

如果你看了有收获,请给我点一个推荐
如果给我打赏了,那保证你未来大富大贵

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

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

相关文章

2025 天津电竞网吧最新推荐榜单权威发布:Z 世代电竞领衔五大实力品牌,技术与口碑深度解析!

引言 伴随京津冀电竞产业协同发展提速,天津电竞市场规模年增速超 30%,各类机构数量呈爆发式增长。但行业快速扩张背后乱象凸显:近 40% 机构存在硬件配置缩水、网络延迟严重问题,25% 缺乏专业运营团队,用户维权率较…

合成孔径雷达(SAR)成像仿真

一、SAR仿真架构 1. 核心模块划分 graph TD A[雷达参数配置] --> B[信号生成] B --> C[目标场景建模] C --> D[回波模拟] D --> E[运动补偿] E --> F[成像算法] F --> G[图像评估] 2. 关键技术指标参…

2025 年最新推荐智能门锁厂家榜单:涵盖高端 / 猫眼 / 家用 / 人脸 / 续航 / 掌静脉等多类型,帮消费者避开劣质产品选到靠谱品牌

引言 当下智能门锁市场蓬勃发展,却也乱象丛生。大量品牌涌入导致产品质量良莠不齐,部分产品存在指纹识别失误、续航短、安全防护不足等问题,让消费者选购时倍感迷茫。不少厂家重营销轻研发,产品更新滞后,难以满足…

动车受电弓网检测系统 保障高速铁路安全高效运行

受电弓-接触网(弓网)系统是高速列车获得持续稳定动力供给的唯一途径。受电弓检测对于高速铁路的安全、高效运营至关重要。受电弓监测有助于确保列车高效运行和极小的损耗、磨损。随着列车速度的提高,受电弓系统的反…

超越“系统性沉默”:“AI元人文”构想下的价值范式转换与游戏化探索

超越“系统性沉默”:“AI元人文”构想下的价值范式转换与游戏化探索 ——技术与哲学的思辨 作者: 岐金兰 摘要: 当前人工智能伦理领域存在一种值得关注的“系统性沉默” :研究者在承认价值表征内在困难的同时,持续…

通信协议(Http,websocket)

http协议详情http是超文本传输协议,浏览器和web服务器之间交互的通信协议,它是基于Tcp之上的应用层协议(osi七层)。特点:基于请求响应,服务端不能主动给客户端推送消息。 无状态无连接,不能做会话保持。协议本身不…

详细介绍:go语言学习记录9.23

详细介绍:go语言学习记录9.23pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

npm install 时包库找不到报错解决 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

MATLAB 仿真无线传感器网络(WSN)三大经典场景

一、统一参数区(建议先调这里) %% 0. 公共参数 clear; clc; close all; rng(2025) % 可重复 field = [0 100; 0 100]; % 100 m 100 m nNode = 200; % 节点数 R = 1…

P13382 解题报告

前言 连续段 DP 板子,问题在于没有学连续段 DP 并理解其本质 这个题目还可以当成每一次插入一些字母是一个很好的 trick 同时记得联考没有好东西,不会就跳了看后面的暴力拿满 经常出现 T3,4 没有时间做的情况也可以…

免费搜索下载ICON图标的网站

之前有个网站,后来关闭了。刚刚找一个,貌似还可以。 https://icon-icons.com/zh/

6ES7592-1BM00-0XA0 32路dq接线端子

6ES7592-1BM00-0XA0 32路dq接线端子短答:不能。6ES7592-1BM00-0XA0 不是 32 路 DQ(Digital Output)模块,它只是 S7-1500 系列用的 前端接线端子 / front connector(40-pole),用来把线接到模块/紧凑型 CPU 的前端…

轻松掌握:用 Python 的 pdfminer 将 PDF 内容保存为 Word 文档 - 详解

轻松掌握:用 Python 的 pdfminer 将 PDF 内容保存为 Word 文档 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

我最常用的快捷键

显示桌面:Win + D 锁屏:Win + L 打印:Ctrl + P 搜索:Win + S 上移至顶部:Ctrl + Home 下移至底部:Ctrol + End 另外比较通常的快捷键: 打开文件:Ctrl + O 保存文件:Ctrl + S 复制:Ctrl + C 粘贴:Ctrl + V 新…

Semgrep代码审计工具的使用

Semgrep代码审计工具的使用 1 Semgrep简介 Semgrep(Semantic Grep)是一款开源的轻量级静态代码分析工具(SAST),由安全公司r2c开发和维护。它采用模式匹配的方式在代码中搜索特定模式,从而识别安全漏洞、代码质量…

WPF多语言实现

参考:https://www.cnblogs.com/chenshibao/p/18937359 开发工具:Visual Studio2022 使用资源字典实现。首先创建在项目下新建多语言目录,新建语言资源en-US.xaml内容 <ResourceDictionaryxmlns="http://sch…

16 倍性能提升,成本降低 98%! 解读 SLS 向量索引架构升级改造

为了优化大规模应用场景下的性能和成本压力,我们针对 Embedding 服务的推理瓶颈进行了系统性优化。通过深入分析、方案选择与定制优化,最终实现了吞吐量提升 16 倍,同时显著降低了单位请求的资源成本。作者:郑前祎…

unity设置外置文件,运行读取文件获取地址

直接放代码吧public static string url= "http://192.168.1.43:9100";//public static string url = "http://43.137.7.254:10028/server";private void Awake(){StartCoroutine(GetPath());}IEnu…

Microsoft Agent Framework/C#:了解Workflows的几种不同模式

前言 最近有空的时候在学习Microsoft Agent Framework,在这个框架中目前Workflows分为了Sequential、Concurrent、Handoffs以及Groupchat四种模式,今天让我们来了解一下这四种不同的模式。 首先需要以下两个包:Sequ…

CodeForces-374D Inna and Sequence

tag: *2000;线段树,二分CodeForces-374D Inna and Sequence tag: *2000;线段树有一个比特串 \(w\),初始为空。给定 \(a_1,\cdots,a_m\),满足 \(1\le a_1<\dots<a_m\)。有三种操作:操作 \(-1\):令 \(k\) 为…