Названные функции недооценены в JavaScript? - PullRequest
6 голосов
/ 27 октября 2009

Взяв, например, инфраструктуру jQuery, если вы запускаете такой код:

$(document).ready(function init() { foo.bar(); });

Трассировка стека, полученная в Firebug, будет выглядеть так:

init()
anonymous()
anonymous([function(), init(), function(), 4 more...], function(), Object name=args)
anonymous()
anonymous()

Как видите, он не очень читабелен, потому что вам нужно нажимать на каждую функцию, чтобы узнать, что это такое. Анонимные функции также отображаются в профилировщике как (?)(), что может привести к ошибке " не может получить доступ к оптимизированному закрытию ". Мне кажется, это веские причины избегать их. Кроме того, существует тот факт, что ECMAScript 5 устареет arguments.callee в его строгом режиме, что означает, что с ним невозможно будет ссылаться на анонимные функции, что делает их чуть менее ориентированными на будущее.

С другой стороны, использование именованных функций может привести к повторению, например ::

var Foo = {
    bar: function bar() {}
}

function Foo() {}

Foo.prototype.bar = function bar() {}

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

Ответы [ 4 ]

3 голосов
/ 27 октября 2009

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

Во-вторых, существует различие между операторами функций и выражениями. Анонимная функция - это просто выражение функции с опущенным идентификатором, и добавление идентификатора (назвав его) не сделает его оператором (за исключением JScript, поэтому он не работает). Это означает, что все остальные ответы были неуместны.

3 голосов
/ 27 октября 2009

Я согласен, что есть некоторые недостатки использования анонимных методов в JavaScript / EMCAScript. Однако не забывайте, как их следует использовать. Для простых однострочников, которые вы хотите передать другой функции, они часто превосходны.

1 голос
/ 27 октября 2009

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

0 голосов
/ 27 октября 2009

Анонимные функции очень удобны. Лучшим решением этой проблемы вместо именования функций было бы, если бы firebug сообщал вам, в какой строке в каком файле была создана анонимная функция.

init()
anonymous() // application.js, line 54
anonymous() // foo.js, line 2

И трассировка стека - единственное место, где анонимные функции являются проблемой imo.

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