news 2026/11/1 11:33:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
js函数声明和函数表达式的理解

在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.chartContainer

const 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。

目前是:先使用后定义,那么在运行的时候会报错吗?

答案是:不会的。

因为:这里有一个重要的执行时机差。实际上在调用前,已经被定义了。

我们被代码的先后顺序给误导了。

并不是说:定义函数表达式的代码必须要写在函数调用之前。

异步执行时机

const resizeObserver = new ResizeObserver(() => {

resizeFn() // 这里不会立即执行!

})

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

代码执行顺序

// 步骤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)

尾声

如果你看了有收获,请给我点一个推荐

如果给我打赏了,那保证你未来大富大贵

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 13:13:29

计算机Java毕设实战-基于springboot的汽车租赁买卖管理系统的设计与实现入库录入、租赁登记、租赁状态查询【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/10/31 12:24:20

华为OD机考双机位C卷 - 编程能力提升计划 (Java Python JS C/C++ GO )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 华为OD机考双机位C卷 题目描述 为了提升软件编码能力,小王制定了刷题计划,他选了题库中的n道题,编号从0到n-1,并计划在m天内按照题目编号顺序刷完所有的题目(注意,小王不能用多天完成同一…

作者头像 李华
网站建设 2026/10/31 3:35:36

ORACLE检查并创建表空间和表分区

为确保系统在高并发、大数据量环境下的稳定高效运行,要求建立完善的表空间与表分区管理机制,具体包括:定期检查表空间使用率,及时发现并处理空间不足风险;建立分区自动创建与维护流程,防止因分区缺失导致的…

作者头像 李华
网站建设 2026/11/1 20:46:42

港媒盛赞“香港媳妇”徐冬冬!婚照惊艳全网,港圈作品圈粉无数

12月18日,徐冬冬与尹子维的婚纱照强势空降热搜,甜酷兼具的造型让网友直呼美貌惊艳,气质独一份。从戏里媚骨天成的“大嫂”到戏外被港媒追捧的“香港媳妇”,这位东北大妞不仅用八年分合的爱情故事打动人心,更在港娱圈深…

作者头像 李华
网站建设 2026/11/2 2:28:11

Redis高级特性与生产环境部署

Redis高级特性与生产环境部署实践一、Redis核心数据类型深度解析1.1 哈希(Hash)类型详解1.1.1 哈希数据结构# 哈希结构示意图 key: "user:1001" value: {"name": "张三","age": 25,"city": "北京…

作者头像 李华
网站建设 2026/11/2 2:28:11

java计算机毕业设计网咖会员管理系统 电竞馆会员计费与点餐一体化平台 网吧会员上机充值及订单管理系统

计算机毕业设计网咖会员管理系统67kvh9(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。疫情后电竞消费井喷,传统网吧前台手工登记、纸质充值券、Excel对账的模式已无法…

作者头像 李华