javascript中函数name属性:普通函数返回声明名,匿名/箭头函数返回"",bound函数为"bound "+原name且不可修改;自定义名称需用包装函数配合object.defineproperty。

JavaScript 中函数的 name 属性用于获取函数的名称,但不同类型的函数(尤其是通过 bind 创建的 bound 函数)表现不一致。关键点是:bound 函数的 name 属性以 "bound " 开头,后跟原函数的 name,这是规范定义的行为。
普通函数和箭头函数的 name 行为
普通具名函数会显示其声明时的名字;匿名函数(包括函数表达式未命名、箭头函数)通常返回 "" 或 "anonymous"(具体取决于引擎,但现代环境多为 ""):
-
function foo() {}→foo.name === "foo" -
const bar = function() {}→bar.name === ""(非严格模式下部分环境可能为"anonymous") -
const baz = () => {}→baz.name === ""
bound 函数的 name 是组合字符串
调用 fn.bind(thisArg, ...args) 返回的 bound 函数,其 name 属性被规范强制设为 "bound " + 原函数.name(注意 "bound " 后带一个空格):
-
function add(a, b) { return a + b; }const add5 = add.bind(null, 5);
→add5.name === "bound add" - 即使原函数是匿名的:
(function(){}).bind().name === "bound "(即空格后无字符) - 嵌套 bind 会叠加前缀:
add.bind().bind().name === "bound bound add"
不能直接修改 bound 函数的 name
name 属性在 bound 函数上是不可写、不可配置的(writable: false, configurable: false),尝试赋值无效:
-
add5.name = "myAdd";→ 赋值静默失败(非严格模式),或抛TypeError(严格模式) -
Object.defineProperty(add5, "name", { value: "x" });→ 抛TypeError
想自定义名称?用包装函数代替 bind
若需可控的函数名,可手动封装而非依赖 bind:
-
const add5 = function(...args) { return add(5, ...args); };
→add5.name === "",但可通过Object.defineProperty设置(因普通函数的name可配置): Object.defineProperty(add5, "name", { value: "add5", configurable: true });
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











