Различия между именованными и безымянными функциями Javascript - PullRequest
11 голосов
/ 12 апреля 2019

Обычно в Javascript, когда я хочу передать анонимную / встроенную функцию в качестве аргумента другой функции, я делаю одно из следующего:

someFunctionCall(function() {
    //...
});

someFunctionCall( () => {
    //...
});

Однако недавно я унаследовал кодовую базукоторый использует именованную функцию в качестве встроенных аргументов, как это

someFunctionCall(function foo() {
    //...
});

Я никогда раньше не видел этот синтаксис.Функция все еще кажется анонимной - нет функции foo, определенной ни в вызывающей, ни в вызываемой области.Это просто вопрос стиля, или может использование именованной функции (foo выше) в качестве анонимной функции изменить поведение или состояние этой программы?

Это специально для NodeJS (не на основе браузера).program), и меня особенно интересует поведение, специфичное для использования функций в качестве параметров.При этом приветствуется информация о поведении на разных платформах и во время выполнения.

Ответы [ 3 ]

8 голосов
/ 12 апреля 2019

Существует как минимум три преимущества использования выражений именованных функций вместо выражений анонимных функций.

  • Упрощает отладку, так как имя функции отображается в иерархии вызовов.
  • Имя функции доступно во внутренней области функции, поэтому его можно использовать для рекурсии
  • Само имя функции действует как самостоятельная документация о том, что делает функция вместо чтения кода.
2 голосов
/ 12 апреля 2019

Использование этих «именованных анонимных функций» не изменит поведения, но покажет имя функции в следах стека, что очень полезно.Также функция становится вызываемой внутри себя таким образом.

0 голосов
/ 12 апреля 2019

Я приведу пример

Случай 1:

var obj =  {count: 0, counter: ()=> {this.count+=1;}}

Если вы сделаете console.log (obj.count), вы получите 0

Случай 2:

var obj  = {count: 0, counter (){this.count+=1;}}

Во 2-м случае, если вы выполните console.log (obj.count), значение будет равно единице.

Надеюсь, вы уже поняли. Лямда-выражения не могут получить доступ к значениям со ссылкой на этот объект. Он может получить доступ только к переменным с глобальной ссылкой.

В случае 1, если вы хотите, чтобы он работал с lamba, вы должны использовать obj.count + = 1 с именем, на которое есть ссылка.

И остальная часть реализации функции JavaScript остается такой же, разницы не много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...