有 表达式
和 声明式
两种函数声明方式
- 函数的声明式写法为:
function test(){}
,这种写法会导致函数提升,所有通过function
关键字声明的变量都会被解释器优先编译,不管声明在什么位置都可以调用它,但是它本身并不会被执行。
test(); // 测试
function test() {
console.log("测试");
}
test(); // 测试
- 函数的表达式写法为:
var test = function(){}
,这种写法不会导致函数提升,必须先声明后调用,不然就会报错。
test(); // 报错:TypeError: test is not a function
var test = function () {
console.log("测试");
};
二者的区别
//函数声明式
function greeting() {
console.log("hello world");
}
//函数表达式
var greeting = function () {
console.log("hello world");
};
- 函数声明式变量会声明提前 函数表达式变量不会声明提前
- 函数声明中的
函数名
是必需的,而函数表达式中的函数名则是可选的
。 - 函数表达式可以在定义的时候直接在表达式后面加()执行,而函数声明则不可以。
function fun(){
console.log('我是一个函数声明式')
}(); //unexpected token
var foo = function (){
console.log('我是一个函数表达式')
}(); //我是一个函数表达式
- 自执行函数即使带有函数名,它里面的函数还是属于函数表达式。
(function fun() {
console.log("我是一个函数表达式");
})(); //我是一个函数表达式
因为函数只是整个自执行函数的一部分。