Названные функции недооценены в JavaScript?
-
06-07-2019 - |
Вопрос
Возьмем, к примеру, инфраструктуру 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, является недосмотром?
Решение 2
Я нашел ответ на свой вопрос в этой очень информативной статье . Во-первых, оказывается, что я был прав, когда именованные функции более желательны, но решение не так просто, как добавление идентификаторов ко всем анонимным функциям. Основная причина этого заключается в том, что JScript реализует функциональные выражения в очень неправильном виде.
Во-вторых, существует различие между операторами функций и выражениями. Анонимная функция - это просто выражение функции с опущенным идентификатором, и добавление идентификатора (назвав его) не сделает его оператором (за исключением JScript, поэтому он не работает). Это означает, что все остальные ответы были неуместны.
Другие советы
Я согласен, что есть определенные недостатки использования анонимных методов в JavaScript / EMCAScript. Однако не забывайте, как их следует использовать. Для простых однострочников, которые вы хотите передать другой функции, они часто превосходны.
Но для меня анонимные функции более читабельны в исходном коде, потому что я уверен, что они используются только там.
Анонимные функции очень удобны. Лучшим решением этой проблемы вместо именования функций было бы, если бы firebug сообщал вам, в какой строке в каком файле была создана анонимная функция.
init()
anonymous() // application.js, line 54
anonymous() // foo.js, line 2
А трассировка стека - единственное место, где анонимные функции являются проблемой imo.