函数表达式和函数声明有什么区别?
1.背景介绍
函数声明
函数声明可以定义命名的函数变量,而无需给变量赋值。函数声明是一种独立的结构,不能嵌套在非功能模块中。可以将它类比为 变量声明。就像变量声明必须以“var”开头一样,变量声明必须以“function”开头。函数名在自身作用域和父作用域内是可获取的。
函数表达式
函数表达式将函数定义为表达式语句(通常是变量赋值)的一部分。通过函数表达式定义的函数可以是命名的,也可以是匿名的。函数表达式不能以“function”开头。函数名在作用域外是不可获取的。
2.知识剖析
JavaScript 中需要创建函数的话,有两种方法:函数声明、函数表达式,各自写法如下:
image.png
3.常见问题
函数表达式和函数声明有什么区别?
4.解决方案
image.png
image.png
以上代码alert的时候,alert(t1)的时候显示的是t1的函数,alert(t2)的时候显示的是undefined
原因在于JavaScript中存在一种变量声明被提升的机制,也就是说变量(函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。t1是函数声明,被提升到作用域最前面,所以alert(t1)依然取得到t1。t2是函数表达式,没有被提升,仍然按照从上往下读取,所以alert(t2)取不到t2的值
5.编码实战
6.扩展思考
函数声明运行规则:
函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。