You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中function expression(函数表达式)的判定标准是什么?

函数表达式(Function Expression)的核心判定规则

你之前的理解存在偏差:函数表达式的判定和是否被存储到变量/参数中没有必然关系,核心看function关键字所处的语法上下文:

  • 如果function出现在语句的起始位置,属于语句上下文,就是「函数声明(Function Declaration)」
  • 如果function出现在表达式上下文中,不管有没有名字、有没有被赋值给变量,都属于「函数表达式」

对应你的几个示例逐一解释:

  1. 第一个示例的代码:
let func = function() {
   console.log(5);
};

这里function出现在赋值运算符=的右侧,属于表达式上下文,因此是函数表达式,符合你之前的认知。

  1. 第二个回调示例的代码:
function func(callback) {
   callback();
};
func(function() {
   console.log(5);
});

这里传入func的匿名函数,是作为函数调用的实参,实参本身就是表达式的位置,因此它本身就是函数表达式,「被赋值给callback参数」只是后续的操作,不是它成为函数表达式的原因。

  1. 你困惑的第三个示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:54:05