匿名函数如何知晓自身名称?JS代码相关推理疑问解析
问题解答
你的推理错误点
- 错误认为
() => {}生成的是完全匿名的函数对象:ES6及之后的JavaScript中,这类函数并非完全匿名,引擎会根据定义上下文自动推断并设置name属性。 - 错误认为函数的
name属性是赋值后才被赋予的:实际上,函数的name属性在创建阶段就已经被引擎确定,并非赋值运算符修改了右侧的函数对象。
原理说明
当你执行const foo = () => {}时,这属于赋值式函数定义场景,ES6规范明确规定:如果函数表达式是赋值操作的右侧值,且左侧是一个标识符(这里就是foo),那么引擎会将这个标识符作为函数的name属性值。这个赋值是在函数对象创建时完成的,和后续的赋值操作无关——赋值运算符只是把已经带有name属性的函数对象引用绑定到变量foo上,并没有修改函数本身。
至于代码中第3、4行的表现:bar只是引用了同一个函数对象,函数的name属性从创建时就固定为foo,所以无论用哪个变量引用它,输出的name值都不会变,这和你“赋值运算符不修改右侧值”的认知是一致的。
补充:真正的匿名函数是没有上下文可推断名称的场景,比如setTimeout(() => { console.log('hi') }, 1000),这个箭头函数的name属性会是空字符串,不会有自动推断的名称。
内容的提问来源于stack exchange,提问作者lamc
相关产品推荐
相关产品推荐

