函数表达式不会被提升,必须先定义后调用;可匿名或具名,具名时函数名仅在内部可见,用于递归或调试。

函数表达式不是声明,不会被提升
函数表达式写在赋值语句右侧,本质是创建一个函数对象并赋给变量。它不会像函数声明那样被“提升”到作用域顶部,必须先定义、后调用。例如:
-
错误写法(会报 ReferenceError):
foo(); var foo = function() { console.log('hello'); }; -
正确写法:
var foo = function() { console.log('hello'); }; foo();
函数名在表达式中是可选的
函数表达式可以是匿名的,也可以带名字(具名函数表达式)。名字只在函数内部可用,用于递归或调试,对外部作用域不可见。
- 匿名:
const add = function(a, b) { return a + b; }; - 具名:
const factorial = function fact(n) { return n (<code>fact在外部无法访问)
结尾必须加分号
因为函数表达式属于赋值语句(如 const fn = function() {...}),整条语句需以分号结束。省略分号可能引发自动分号插入(ASI)问题,尤其在紧跟换行有 [、(、+ 等符号时易出错。
- 推荐:
const greet = function() { return 'Hi'; }; - 风险写法(不推荐):
const greet = function() { return 'Hi' }(缺分号,后续若接数组字面量可能报错)
不能作为独立语句出现在块级结构开头
如果把函数表达式直接写在 {} 或 if、for 等语句块首行,JS 引擎可能误判为函数声明,导致语法错误或行为异常。
- 避免:
if (true) { function bar() {} }(行为不一致,不同引擎解析不同) - 安全写法:
if (true) { const bar = function() {}; }或if (true) { (function bar() {}); }











