JavaScript называет объектные функции - PullRequest
0 голосов
/ 27 августа 2018

Довольно новый для JS,

Используя простой пример объекта с функцией:

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

Я заметил, что вы можете называть объектные функции (например, descriptiveFunctionName выше)

Есть ли случаи, когда это необходимо / полезно, а не оставлять анонимным?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Еще одна причина, по которой вы можете захотеть сделать это, чтобы вы могли получить имя функции позже. Поэтому, если вы можете присвоить переменную одной из многих функций, а затем захотите увидеть, какую из них вы назначили, вы можете вызвать ее с помощью .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
0 голосов
/ 27 августа 2018

Есть ли случаи, когда это необходимо / полезно, а не оставлять анонимным?

Начиная с ES2015, даже если вы пропустите descriptiveFunctionName, ваша функция не будет анонимной, она будет иметь имя (talk). ES2015 добавил выведенные имена функций (и, наконец, свойство name). Имена выводятся в большинстве ситуаций, с единственным действительно важным местом, где они не выводятся, будучи obj.foo = function() { } (что оставляет функцию с именем "", а не "foo").

Отдельно, если функция будет рекурсивной или иным образом ссылается на себя (задается в качестве обработчика событий и т. Д.), Вы можете предпочесть ссылаться на нее по ее имени (которое находится внутри нее).

Итак, причины добавления имени:

  1. Если вы создаете объект, как показано в вашем вопросе, и вы хотите, чтобы фактическое имя функции не совпадало со свойством, которое вы инициализируете с помощью функции.
  2. Если вы делаете obj.foo = function nameHere() { }; и хотите, чтобы у функции было имя, а не "".
  3. Он будет ссылаться на себя, и вы хотите использовать это имя, а не свойство объекта.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...