在 JavaScript 中,有具名函数和匿名函数之分,匿名函数即其name属性为空字符串。根据声明语句的不同,函数名称也会有不同表现。具体见如下代码:
// 直接写一个匿名函数语句会报错
function(){} // Uncaught SyntaxError: Function statements require a function name
// 声明一个具名函数
function f1(){}
f1.name // f1
// 通过 var 使用变量声明函数时
// 若声明语句右侧函数表达式中的函数为匿名函数,则最终声明的可访问函数 f2 的名称 name 为左侧的声明的变量名 f2
var f2=function(){}
// 或 var f2=()=>{}
f2.name // f2
// 若声明语句右侧函数表达式中的函数为具名函数,则最终声明的可访问函数 f3 的名称 name 为右侧具名函数的函数名 f4
// 并且无法通过右侧的函数名 f4 访问最终声明的函数 f3
var f3=function f4(){}
f3.name // f4
f4 // Uncaught ReferenceError: f4 is not defined
而作为一个对象中的函数属性时,函数的名称又有不同表现。具体见如下代码:
// 在对象生成时通过字面量添加的函数属性,其名称表现基本同声明语句
// 在函数属性值为匿名函数表达式时,会把属性名做为函数的名称 name
var obj={
f1(){},
f2: function(){},
f3: ()=>{},
f4: function f5(){},
}
obj.f1.name // f1
obj.f2.name // f2
obj.f3.name // f3
obj.f4.name // f5
// 但之后通过 obj 访问对象添加函数属性时,其函数的名称完全由右侧的函数表达式决定
// 在函数属性值为匿名函数表达式时,不会把属性名作为函数的名称 name
obj.f6=function(){}
obj.f7=()=>{}
obj.f8=function f9(){}
obj.f6.name // ''
obj.f7.name // ''
obj.f7.name // 'f9'
----- 极客时间《JavaScript 核心原理解析》学习笔记 Day 4 -----

文章详细阐述了JavaScript中匿名函数和具名函数的区别,以及在不同声明方式下函数的name属性如何体现。通过示例代码展示了函数声明、变量赋值和对象属性中的函数命名规则,包括函数表达式的name属性和实际访问名称的差异。
1126

被折叠的 条评论
为什么被折叠?



