JavaScript函数的name属性返回其名称,但表现不一致:函数声明返回标识符名;具名函数表达式返回内部名;匿名表达式、箭头函数返回空字符串;bind函数加"bound "前缀;class方法、异步/生成器函数有特定前缀。

JavaScript 中函数的 name 属性用于获取函数的名称,但它在不同声明方式下表现不一致——不是所有函数都有可预测或有意义的 name 值,尤其在匿名、箭头、绑定或动态创建的函数中。
函数声明(Function Declaration)
函数声明的 name 属性总是返回其标识符名称,且不可写、不可配置。
function foo() {}
console.log(foo.name); // "foo"
- 即使函数内部重命名(如赋值给另一变量),
name不变 - 支持具名函数表达式(Named Function Expression)时,
name取的是「表达式中写的名称」,而非变量名
函数表达式与具名/匿名形式
匿名函数表达式的 name 是空字符串;具名函数表达式的 name 是其内部名称(非绑定变量名)。
const bar = function() {};
console.log(bar.name); // ""
const baz = function qux() {};
console.log(baz.name); // "qux"(不是 "baz")
- 该名称仅在函数内部可用(如递归调用),不影响外部变量名
- 引擎可能根据上下文推断匿名表达式的名称(如赋值语句右侧),但这是非标准行为,不可依赖
箭头函数(Arrow Function)
箭头函数没有自己的 name,始终返回空字符串 "",因为它没有标识符且不绑定 this。
立即学习“Java免费学习笔记(深入)”;
const fn = () => {};
console.log(fn.name); // ""
const obj = {
method: () => {}
};
console.log(obj.method.name); // ""
- 即使出现在对象方法位置或赋值给有含义的变量,
name仍为空 - 不能通过任何方式为箭头函数设置
name(属性只读)
构造函数、bind、class 方法等特殊情况
Function 构造器创建的函数 name 为 "anonymous";bind 返回的函数 name 以 "bound " 开头;class 中的方法名通常能正确反映。
const dynamic = new Function('return 42');
console.log(dynamic.name); // "anonymous"
const bound = (function abc() {}).bind(null);
console.log(bound.name); // "bound abc"
class C {
hello() {}
}
console.log(C.prototype.hello.name); // "hello"
-
bind后的函数name是只读字符串,无法修改 - getter/setter 的
name是访问器名(如"get prop"或"set value") - 异步函数、生成器函数会在名称前加
"async "或"*"(如"async foo"、"*gen")
不复杂但容易忽略:判断函数来源时别单靠 name,它只是提示性信息;需要唯一标识应结合 toString()、constructor 或自定义元数据。


















