大家好,我是IT修真院深圳分院第4期学员梁耀,一枚正直纯洁善良的web程序员。
今天给大家分享:
【JS-01】函数表达式和函数声明有什么区别?
Web小课堂
分享人:梁耀
1.背景介绍
函数声明
函数声明以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体。函数声明必须是一个单独的JavaScript语句。
function sum(num1,num2){
return num1+num2;
}
函数表达式
在任何情况下都是其它JavaScript语句的一部分(比如赋值表达式等号的右侧、函数的参数)的函数被称为函数表达式。
var sum=function(num1,num2){
return num1+num2;
}
函数声明以及函数表达式
函数声明会在解析器率先读取,而函数表达式需要解析器执行到函数所在的位置(代码行)
才会被解析执行,即函数声明的优先度灰比函数表达式要高;
console.log(sum(10,20));
function sum(num1,num2){
return num1+num2;
}
这个例子是可以执行的,就是因为函数声明会被调到执行环境之前;
console.log(sum(10,20));
var sum=function(num1,num2){
return num1+num2;
}
这个是不能执行的,会报错,因为解析器是先解析console,但是console里面的sum是没有保存对函数的引用
拓展思考
函数声明提升以及变量声明提升
引擎解析javascript代码的之前会对其进行编译。在编译过程中会查找所有声明,并用合适作用域将他们关联起来。换句话说,在代码执行之前,会对作用域链中所有变量和函数声明先处理完先。
参考文献
《JavaScript高级程序设计》
问题1:
名字解析顺序是以怎样的顺序进行的?
答:javascript中一个名字(name)以四种方式进入作用域(scope),其优先级顺序如下:
1、语言内置:所有的作用域中都有 this 和 arguments 关键字
2、形式参数:函数的参数在函数作用域中都是有效的
3、函数声明:形如function foo() {}
4、变量声明:形如var bar;
假如一个函数的名字跟变量的名字相同,那么函数的名字会覆盖掉变量的名字;如果同等优先级的,名字后面的会覆盖名字前面的
问题2:
声明变量是在所有地方都可以提升吗?
答:不是,js没有块级作用域,变量声明提升只有在函数内部才有效果
问题3:
正常情况下该使用函数表达式还是函数声明?
答:函数表达式适合只使用一次的函数;函数声明适合使用多次
获得更多IT技能,请移步官网 点击链接直达:www.jnshu.com
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
------------------------------------------------------------------------------------------------------------------------
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧?