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

1.背景介绍

函数声明

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

 

函数表达式

函数表达式将函数定义为表达式语句(通常是变量赋值)的一部分。通过函数表达式定义的函数可以是命名的,也可以是匿名的。函数表达式不能以“function”开头。函数名在作用域外是不可获取的。

 

2.知识剖析

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

 

函数声明

 

函数表达式

 

3.常见问题

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

 

4.解决方案

以上代码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语句构成的)。

 

 

7.参考文献

函数声明 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

 

 

8.更多讨论

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

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

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

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

3. ~function是什么?

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

 

 

9.鸣谢

感谢大家观看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值