如何区分函数声明和函数表达式
区分函数声明和函数表达式最简单的方式是看function
关键在出现在声明中的位置。
- 如果
function
是声明中的第一个词,那么就是一个函数声明。 - 否则就是一个函数表达式。
考虑以下代码:
//我是函数声明
function foo(){
console.log("1");
}
//我是函数表达式
var foo = function bar(){
console.log("1");
}
区别
- 在函数声明中,函数名是必须的;而在函数表达式中,函数名是可以省略的(匿名函数)
- 在提升过程中,函数声明会被整体提升到当前作用域的顶部;而函数表达式只有变量标识符被提升到了作用域顶端。
接下来我们来详细看一下
具名函数和匿名函数
对于匿名函数,大多数人比较熟悉的场景就是回调参数,举个栗子:
setTimeout(function(){
console.log("I waited 1 second!");
},1000 );
这就是匿名函数表达式,因为function()...
没有名称标识符。
具名函数就是比较常见的形式:
var foo = function bar(){
console.log("1");
}
对比一下,虽然匿名函数看起来更为简洁,但是它也有几个缺点需要考虑:
- 匿名函数在栈追踪的时候不会显示出有意义的函数名,使得调试很困难。
- 匿名函数省略了函数名(这对代码的可读性十分重要),一个描述性的名称会让代码的功能不言而喻。
小建议:给函数表达式命名会让你的代码有更高的可读性和可理解性,所以尽可能做到始终给函数命名。
函数提升
关于函数提升的相关知识可以移步JavaScript----提升中的关于函数提升的叙述。