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

函数表达式和函数声明有什么区别?

1.背景介绍

函数声明

函数声明可以定义命名的函数变量,而无需给变量赋值。函数声明是一种独立的结构,不能嵌套在非功能模块中。可以将它类比为变量声明。就像变量声明必须以“var”开头一样,变量声明必须以“function”开头。函数名在自身作用域父作用域内是可获取的。函数是独立的功能模块。

函数表达式

函数表达式将函数定义为表达式语句(通常是变量赋值)的一部分。通过函数表达式定义的函数可以是命名的,也可以是匿名的。函数表达式不能以“function”开头函数名在作用域外是不可获取的。(表达式,是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合约束变量在表达式中已被指定数值,而自由变量则可以在表达式之外另行指定数值。)表达式不是福利的功能模块。

2.知识剖析

JavaScript 中需要创建函数的话,有两种方法:函数声明、函数表达式,各自写法如下:

函数声明

函数表达式

3.解决方案

以上代码alert的时候,alert(t1)的时候显示的是t1的函数,alert(t2)的时候显示的是undefined。原因在于JavaScript中存在一种变量声明被提升的机制,也就是说变量函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。t1是函数声明,被提升到作用域最前面,所以alert(t1)依然取得到t1。t2是函数表达式,没有被提升,仍然按照从上往下读取,所以alert(t2)取不到t2的值。

4.扩展思考

函数声明运行规则:

函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

5.参考文献

函数声明 VS 函数表达式

https://libuchao.com/2012/06/25/function-declaration-vs-function-expression

JavaScript探秘:函数声明与函数表达式

http://www.nowamagic.net/librarys/veda/detail/1630

关于Javascript的函数声明和函数表达式

https://github.com/Wscats/Good-text-Share/issues/73

6.更多讨论

1. 多个函数声明提升到顶部的排序是怎么排序的?

函数声明提升,是由代码先后顺序绝定的,先定义的函数声明先提升。

2. 函数(变量)提升指的到底是什么?

“函数(变量)提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中

3. ~function是什么?

~function(){}(),一般是用来IIFE执行函数的,我们一般常见的是这种形式(funciton(){})()。但是前面加一个按位非,也可以实现等同于()分组运算符的效果,不过并不建议使用,因为像~,-,void都会去改变一些返回值。最好还是用()的形式。

相关文章:

  • vue.js框架原理浅析
  • jTopo详解
  • javascript中逗号详解
  • HTML 5 Canvas 参考手册
  • JavaScript中的IIFE
  • MIME详解
  • CAS单点登录原理解析及相关配置
  • spring依赖注入三种方式
  • php中json_encode()与json_decode() 的详细用法
  • PHP全局变量global与$GLOBAL详解
  • php知识整理
  • PHP中$_SERVER的详细用法
  • MyBatis整理
  • ButterKnife介绍
  • Android之Activity全面解析
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • (三)从jvm层面了解线程的启动和停止
  • Angular 4.x 动态创建组件
  • CODING 缺陷管理功能正式开始公测
  • Computed property XXX was assigned to but it has no setter
  • Django 博客开发教程 16 - 统计文章阅读量
  • Flannel解读
  • HTML中设置input等文本框为不可操作
  • Java 多线程编程之:notify 和 wait 用法
  • java多线程
  • k8s如何管理Pod
  • Otto开发初探——微服务依赖管理新利器
  • PHP的类修饰符与访问修饰符
  • Python利用正则抓取网页内容保存到本地
  • React Transition Group -- Transition 组件
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 因为阿里,他们成了“杭漂”
  • 在weex里面使用chart图表
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (C语言)字符分类函数
  • (WSI分类)WSI分类文献小综述 2024
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (一)u-boot-nand.bin的下载
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .NET CORE Aws S3 使用
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Framework杂记
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @31省区市高考时间表来了,祝考试成功