JavaScript命名对象函数

JavaScript命名对象函数,javascript,javascript-objects,Javascript,Javascript Objects,对JS来说是相当新的 使用具有函数的对象的简单示例: var person = { name: "Bob McBobson", talk: function descriptiveFunctionName() {alert("Hello");} }; 我注意到您可以命名对象函数(例如上面的descriptiveFunctionName) 是否有需要/有帮助而不是匿名的情况 是否有需要/有帮助而不是匿名的情况 从ES2015开始,即使您省略了descriptiveFunction

对JS来说是相当新的

使用具有函数的对象的简单示例:

var person = {
    name: "Bob McBobson",
    talk: function descriptiveFunctionName() {alert("Hello");}
};
我注意到您可以命名对象函数(例如上面的descriptiveFunctionName)

是否有需要/有帮助而不是匿名的情况

是否有需要/有帮助而不是匿名的情况

从ES2015开始,即使您省略了
descriptiveFunctionName
,您的函数也不会是匿名的,它会有一个名称(
talk
)。ES2015最后添加了推断函数名(以及
name
属性)。大多数情况下都会推断出名称,唯一没有推断出名称的真正重要位置是
obj.foo=function(){}
(这使得函数名为
,而不是
“foo”

另外,如果函数将是递归的或以其他方式引用自身(将自身设置为事件处理程序等),则您可能更喜欢通过其名称(在其范围内)引用它

因此,添加该名称的原因:

  • 如果您正在创建问题中所示的对象,并且希望函数的实际名称与您正在初始化的函数的属性不匹配
  • 如果您正在执行
    obj.foo=function nameHere(){}
  • 它将引用自身,您希望使用该名称而不是对象属性

  • 您可能希望这样做的另一个原因是,您可以稍后检索函数名。因此,如果您可以将变量分配给多个函数中的一个,然后想知道您分配了哪个函数,那么可以使用
    .name
    调用它

    var parent={myFunc:undefined};
    var rnd=Math.floor(Math.random()*3);
    交换机(rnd){
    案例0:parent.myFunc=函数减法(x){返回x-1;};中断;
    案例1:parent.myFunc=函数add(x){return x+1;};break;
    案例2:parent.myFunc=函数乘法(x){return x*2;};break;
    }
    
    console.log(parent.myFunc.name);//减法、加法或乘法
    据我所知,
    descriptiveFunctionName
    仅在函数本身内部可用。我说“这是我的理解”,因为我并不是100%同意这一点。您可以通过将警报更改为
    alert(descriptiveFunctionName)
    @Amy来测试这一点-您是正确的(从ES2015开始,函数上的
    name
    属性和堆栈跟踪)。javascript引擎使用函数名来生成更好的堆栈跟踪。这使得调试变得更容易。@snek在我的示例中看到一个答案,它建议将函数命名为“Talk”,你知道它是否会显示在堆栈中吗?@DogBoy-是的,在大多数现代引擎中。最终,可能在所有这些方面。