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

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

什么是函数声明

以 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.gsyq.cn/news/28490.html

相关文章:

  • P13382 解题报告
  • 免费搜索下载ICON图标的网站
  • 6ES7592-1BM00-0XA0 32路dq接线端子
  • Excel 实现下拉多选功能
  • CodeForces-1620D Exact Change
  • Python爬虫:获取某平台数据的下载链接 - 指南
  • 厨房电子秤芯片方案:SIC8632
  • 贡献法算法思维
  • 让cherry studio访问使用Docket Desktop中的Docker Model Runner运行的模型
  • SQL SERVER死锁查询,死锁分析,解锁,查询占用
  • DolphinScheduler依赖机制、Open-Falcon告警推送与监控的优化实践
  • centos7 安装mysql5.7
  • 监控系统搭建集成实例
  • verilog - 指南
  • 2025 年集装箱拖车供应厂家最新推荐榜,技术实力与市场口碑深度解析助力企业选品
  • Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
  • 深入解析:软考系统架构设计师知识点-软件可靠性基础
  • Windows Server 2019 中文版、英文版下载 (2025 年 10 月更新)
  • Windows 7 Windows Server 2008 R2 简体中文版下载 (2025 年 10 月更新)
  • 20 万奖金池就位!Higress AI 网关开发挑战赛参赛指南
  • 10.17 NOIP 模拟赛 T2. 箱思客
  • Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
  • 2025 最新瓷砖厂家推荐榜:精选绿色创新与优质服务品牌,助力家装工程选购不踩坑
  • 零样本学习(Zero-Shot Learning‌)
  • docker 创建私有仓库
  • 视频汇聚平台EasyCVR如何构建智慧农业监控监管系统? - 实践
  • 2025-10-23 在游戏开发领域中,cocos是什么,有什么用,对于前端而言如何入手,和其它的游戏引擎的区别是什么,优缺点是什么
  • 上传图片后图片加载失败,或因后台ftp传输共享目录延迟导致获取不到
  • 劳务工招聘助手小程序管理系统:革新劳务招聘管理的高效解决方案
  • 【图论】kruskal-最小生成树算法简析