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

什么是函数声明

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

函数声明会被提升

在JS中,函数声明会被提升,这意味着函数可以在声明之前被调用。

当你使用函数声明的方式定义函数: function resizeFn() {...}

整个函数声明会被提升到作用域的顶部。

这意味着在整个作用域内,无论函数在何处声明,都可以在声明前调用。

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

scss 复制代码
// 因为是函数声明,所以可以在函数声明之前调用。可以正常调用
resizeFn(); 

// 因为这是一个函数声明。
function resizeFn() {
  // 函数体
}

函数表达式

‌函数表达式‌:将函数赋值给变量,函数可匿名或具名

如 const sayHello = function() {}

或 const sayHello = function named() {}

函数表达式适用于赋值、参数传递等场景。‌‌

函数表达式‌:仅变量名被提升,函数体不会提升。

函数表达式:必须先定义后使用(也就是说在使用[调用]前,必须先定义)

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

scss 复制代码
sayHello()
const sayHello = function() {} 

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

总结:看了上面的函数声明和函数表达式,也许你对函数声明和函数表达式有一定的理解了。

我们来看下面这个,函数表达式一定必须是:先定义后使用嘛?

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

kotlin 复制代码
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。

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

答案是:不会的。

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

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

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

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

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

  1. 代码执行顺序
javascript 复制代码
// 步骤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)

时间线说明

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

尾声

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

相关推荐
nvd115 分钟前
Lit.js 入门介绍:与 React 的对比
开发语言·javascript·react.js
JarvanMo6 分钟前
Flutter3.38 带来了什么
前端
倚栏听风雨22 分钟前
React中useCallback
前端
不说别的就是很菜23 分钟前
【前端面试】前端工程化篇
前端·面试·职场和发展
老华带你飞29 分钟前
记录生活系统|记录美好|健康管理|基于java+Android+微信小程序的记录生活系统设计与实现(源码+数据库+文档)
android·java·数据库·vue.js·生活·毕设·记录生活系统
亿元程序员34 分钟前
微信小游戏包体限制4M,一个字体就11.24M,怎么玩?
前端
涔溪35 分钟前
vue中预览pdf文件
前端·vue.js·pdf
孤狼warrior36 分钟前
目前最新同花顺金融股市数据爬取 JS逆向+node.js补浏览器环境
javascript·爬虫·python·金融·node.js
天若有情67342 分钟前
从零实现轻量级C++ Web框架:SimpleHttpServer入门指南
开发语言·前端·c++·后端·mvc·web应用
摇滚侠1 小时前
css,控制超出部分隐藏,显示... css,控制超出部分不隐藏,换行
前端·css