JavaScript中function expression(函数表达式)的判定标准是什么?
函数表达式(Function Expression)的核心判定规则
你之前的理解存在偏差:函数表达式的判定和是否被存储到变量/参数中没有必然关系,核心看function关键字所处的语法上下文:
- 如果
function出现在语句的起始位置,属于语句上下文,就是「函数声明(Function Declaration)」 - 如果
function出现在表达式上下文中,不管有没有名字、有没有被赋值给变量,都属于「函数表达式」
对应你的几个示例逐一解释:
- 第一个示例的代码:
let func = function() { console.log(5); };
这里function出现在赋值运算符=的右侧,属于表达式上下文,因此是函数表达式,符合你之前的认知。
- 第二个回调示例的代码:
function func(callback) { callback(); }; func(function() { console.log(5); });
这里传入func的匿名函数,是作为函数调用的实参,实参本身就是表达式的位置,因此它本身就是函数表达式,「被赋值给callback参数」只是后续的操作,不是它成为函数表达式的原因。
- 你困惑的第三个示例代码:
let arr = [18, 50]; let obj = { name: 'Karina', }; arr.forEach(function func(value) { console.log(`${this.name} is ${value} years old`); }, obj);
这里的function func(...)同样出现在forEach的实参位置,属于表达式上下文,所以依然是函数表达式(属于命名函数表达式的类型,这个func名称只能在函数内部访问,外部无法读取,也不会污染当前作用域)。
补充其他常见的函数表达式场景:
- 被括号包裹的立即执行函数(IIFE):
// 括号内属于表达式上下文,因此是函数表达式 (function() { console.log('立即执行') })()
- 前面带一元运算符的函数:
// 一元运算符后是表达式上下文,因此是函数表达式 +function() { console.log('立即执行') }()
- 作为对象属性值的函数:
const obj = { // 属于对象属性赋值的表达式上下文,是函数表达式 sayHi: function() { console.log('hi') } }
内容的提问来源于stack exchange,提问作者Heaven
相关产品推荐
相关产品推荐

