深入浅析JavaScript函数声明和函数表达式
什么是函数声明
以 function 关键字开头,必须指定函数名(如 function greet() {}),且不能作为其他语句的一部分。
函数声明会被提升
在JS中,函数声明会被提升,这意味着函数可以在声明之前被调用。
当你使用函数声明的方式定义函数: function resizeFn() {...}
整个函数声明会被提升到作用域的顶部。
这意味着在整个作用域内,无论函数在何处声明,都可以在声明前调用。
函数声明会被提升的代码解释
// 因为是函数声明,所以可以在函数声明之前调用。可以正常调用
resizeFn();
// 因为这是一个函数声明。
function resizeFn() {
// 函数体
}函数表达式
函数表达式:将函数赋值给变量,函数可匿名或具名
如 const sayHello = function() {}
或 const sayHello = function named() {}
函数表达式适用于赋值、参数传递等场景。
函数表达式:仅变量名被提升,函数体不会提升。
函数表达式:必须先定义后使用(也就是说在使用[调用]前,必须先定义)
函数表达式:必须先定义后使用
sayHello()
const sayHello = function() {}

报错: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)
尾声
到此这篇关于JavaScript函数声明和函数表达式的理解的文章就介绍到这了,更多相关js函数声明和函数表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解JavaScript中map()和forEach()的异同
在JavaScript中,map()和forEach()是两个常用的数组方法,它们都用于遍历数组,但在某些方面有一些关键的区别,本文将详细讨论这两种方法的异同,以帮助您更好地理解它们的用法和适用场景,需要的朋友可以参考下2024-02-02
JavaScript实现echarts水球图百分比展示大屏可视化
这篇文章主要为大家介绍了JavaScript实现echarts水球图百分比展示大屏可视化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-10-10
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
js跨平台的事件经验分享,需要的朋友可以参考下2012-08-08
使用JavaScript判断一个元素是否在可视范围内的几种方法
在Web开发中,有时我们需要知道一个元素是否在用户的可视范围内,以便执行相应的操作,比如延迟加载图片、实现懒加载、或是触发动画效果, 本文将详细介绍使用 JavaScript 如何判断一个元素是否在可视范围内的几种方法,需要的朋友可以参考下2024-02-02


最新评论