JavaScript 函数声明方式及区别

函数声明式与函数表达式的区别和使用场景

问题

JavaScript 中函数有哪几种声明方式?它们有什么区别?

解答

JavaScript 函数主要有两种声明方式:函数声明式和函数表达式。

函数声明式

使用 function 关键字声明,会发生函数提升,可以在声明前调用。

test(); // 测试
function test() {
  console.log("测试");
}
test(); // 测试

函数表达式

将函数赋值给变量,不会发生函数提升,必须先声明后调用。

test(); // 报错:TypeError: test is not a function
var test = function() {
  console.log("测试");
};
test(); // 测试

函数表达式的特殊用法

函数表达式可以直接执行(自执行函数):

// 函数声明式不能直接执行
function fun(){  
   console.log('我是一个函数声明式')  
}(); // SyntaxError: Unexpected token

// 函数表达式可以直接执行
var foo = function (){
   console.log('我是一个函数表达式')
}();

// 自执行函数(IIFE)
(function fun(){  
    console.log('我是一个函数表达式')  
})(); // 我是一个函数表达式

关键点

  • 函数声明式会发生变量提升,可以在声明前调用;函数表达式不会提升,必须先声明后调用
  • 函数声明式的函数名是必需的,函数表达式的函数名可选
  • 函数表达式可以作为自执行函数(IIFE)立即执行,函数声明式不可以
  • 自执行函数即使带有函数名,也属于函数表达式