news 2026/1/19 8:40:02

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/1/17 13:21:20

【python大数据毕设实战】哮喘患者症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

作者头像 李华
网站建设 2026/1/18 19:25:11

9 个降AI率工具,MBA 必备避坑指南

9 个降AI率工具,MBA 必备避坑指南 AI降重工具:MBA论文的智能护航 MBA论文写作过程中,越来越多的学生开始依赖AI工具进行内容生成。然而,随着高校对AIGC率的严格管控,如何在保持论文原创性和学术规范的同时,…

作者头像 李华
网站建设 2026/1/19 5:17:44

Windows系统文件inetmib1.dll丢失损坏 下载修复方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/1/17 17:16:16

Boost电路的右半平面零点

3.1、为什么存在这个右零点?(关键点:先储能再释放)答:右零点不是数学上的巧合,而是由Boost电路独特的能量传输方式决定的。其物理过程可以这样理解:假设电路已经稳定工作,此时我们突…

作者头像 李华
网站建设 2026/1/17 11:26:54

【全球AI伦理治理】

AI伦理治理框架的全球协同案例 欧盟《人工智能法案》提出基于风险分级的四层治理体系,禁止社会评分等高风险应用。OECD的AI政策观察站已收录全球700余项政策倡议,形成跨国数据库共享机制。新加坡的Model AI Governance Framework为亚洲企业提供可认证的伦…

作者头像 李华
网站建设 2026/1/19 1:56:03

毕业季必看!7款免费AI写论文神器实测,一站式搞定选题、大纲到降重

如果你是正在熬夜赶Deadline的毕业生,或是面临着科研压力、被导师催稿的研究生,又或是没钱又要写高质量论文的大学生,那么这篇文章简直就是为你量身打造的!在学术的道路上,我们都曾经历过论文选题的迷茫、写作过程的煎…

作者头像 李华