Вопрос

Возьмем, к примеру, инфраструктуру 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top