JavaScript命名对象函数

时间:2018-08-27 17:05:50

标签: javascript javascript-objects

是JS的新手,

使用带有功能的对象的简单示例:

var person = {
    name: "Bob McBobson",
    talk: function descriptiveFunctionName() {alert("Hello");}
};

我注意到您可以命名对象函数(例如上面的descriptiveFunctionName)

在任何情况下都需要/有帮助而不是匿名吗?

2 个答案:

答案 0 :(得分:5)

  

在任何情况下都需要/有帮助而不是匿名吗?

从ES2015开始,即使您在那里遗漏了descriptiveFunctionName,您的函数也不会是匿名的,它会带有一个名称(talk)。 ES2015添加了推断的函数名称(最后还有name属性)。在大多数情况下都可以推断出名称,而没有推断出的唯一真正重要的地方是obj.foo = function() { }(这会使函数使用名称"",而不是{{ 1}})。

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

因此,添加名称的原因:

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

答案 1 :(得分:2)

您可能想要执行此操作的另一个原因是可以在以后检索该函数的名称。因此,如果您可以将变量分配给多个函数之一,然后又想查看分配给哪个函数,则可以使用.name对其进行调用。

var parent = { myFunc: undefined };
var rnd = Math.floor(Math.random() * 3);
switch (rnd) {
  case 0: parent.myFunc = function subtract(x) { return x - 1; }; break;
  case 1: parent.myFunc = function add(x) { return x + 1; }; break;
  case 2: parent.myFunc = function multiply(x) { return x * 2; }; break;
}

console.log(parent.myFunc.name); // subtract, add, or multiply