2010-08-11 3 views
22

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

+0

Анонимные/лямбда-функции - это основная функция функционального программирования. Вы можете узнать больше об этом здесь: http://www.youtube.com/results?search_query=cs61a&aq=f – cbednarski

+0

Инструменты разработчика и стратегии построения/модуля появились с 2010 года. Chrome/WebKit действительно хороши, FireBug является настолько-таки, но адекватным (и обозначение выражения функции также может помочь визуально). В любом случае, учитывая огромное количество раз, что они используются, это ... сомнительная аксиома, возможно, связанная с кодом, который был «слишком умным» и с трудом поддавался/отлаживал, чтобы начать с ... потому что я никогда не чувствовал боли, отлаживая _my_ код ;-) – user2864740

ответ

12

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

Например, JQuery широко использует их.

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

+6

На самом деле, это одна из причин, по которой я прекратил использование jQuery. Это всегда занимало гораздо больше времени, чем я считал разумным определить, была ли ошибка ошибкой синтаксиса в моем коде, логическая ошибка в моем коде или что-то не так с самим jQuery. Вы должны признать, что стек вызовов анонимных функций не делает вещи столь же ясными, как одна из названных функций. – Kev

+6

Вы всегда можете использовать [named function expression] (http://yura.thinkweb2.com/named-function-expressions/#named-expr). –

7

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

Это более полезно и экономит время, чем нет, даже если это делает отладку немного сложнее, но я редко борюсь с отладкой, потому что функция анонимна. И вы должны использовать JSLint, чтобы облегчить вашу жизнь при кодировании.

5

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

+16

Просто потому, что что-то _common_ не означает, что это _correct_. Возможно, нет ничего плохого в использовании анонимных функций, но говоря: «Все делают это» не является допустимым аргументом. –

+0

глубоко вложенная сасса повсюду, но это совершенно неправильно –

-3

Анонимные функциональные выражения: best практика в JavaScript.

+3

Претензия отклоняется из-за отсутствия поддержки. – user2864740

+4

Сокращенный из-за отсутствия ПОЧЕМУ. Кроме того, потому что * обычная практика не обязательно является лучшей практикой. –

4

Просто потому, что каждый использует их, не делает их хорошей практикой (все помнят, используя таблицу элемент для макета?). Но они великолепны, потому что они могут помочь прояснить и упростить ваш код, давая меньше возможностей для того, чтобы что-то пошло не так.

Но анонимные функции не должны быть настолько сложными, что отладка становится сложной с ними. В этом случае, возможно, лучше создать новую функцию.

+3

Вы всегда можете использовать выражение [named function] (http://yura.thinkweb2.com/named-function-expressions/#named-expr). –

+3

+1 для кода лемминга –

+1

@MarcelKorpel: эта ссылка, которую вы предоставили, умерла, но я предполагаю, что вы имеете в виду, что вы можете добавить имя в свою анонимную функцию (делая ее более анонимной) следующим образом: 'var fAnonymous = (function nonAnon () {}); '. Это может помочь при отладке. – palswim

8

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

1) Анонимные функции нельзя использовать повторно.

2) Анонимные функции по определению не имеют имени и поэтому не описывают, что они делают. Который должен сказать, что код не является самостоятельной документацией.

3) Анонимные функции не могут быть протестированы изолированно с модульной схемой тестирования.

4) Мне лично кажется, что они делают код более трудным для чтения и отладки. Хотя ваш опыт может отличаться.

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

+2

1) Анонимные функции и блокировки могут быть повторно использованы, каждая функция является значением и может быть назначена переменной или представлена ​​как аргумент функции - это всего лишь вопрос об экспонировании функционального объекта, такого как правильный уровень/область; 2) Анонимные функции (или выражения функций) _can_ должны иметь явные имена, но «анонимны» в контексте; 3) Зависит от того, что тестируется, как оно тестируется и как отображаются объекты функции; 4) Замыкания/lambdas _can_ можно злоупотреблять в случаях «слишком много хитрости», но _rrrible coders - ужасные кодировщики, даже с самыми тривиальными инструкциями по процедурному кодексу. – user2864740

+0

Я смущен тем, что вы здесь говорите. Если вы даете функции имя и назначаете его переменной, разве это по определению не анонимная функция? Не могли бы вы привести пример анонимного имени? – bhspencer

+0

Проблема заключается в том, что термин «анонимная» функция является ложью. Реальный термин должен быть выражением * функции * или * замыканием * или даже * лямбда * (это отличается от «оператора функции верхнего уровня» или «метода»). Потому что, как можно использовать «анонимную» функцию (кроме IIFE) без имени * some *, присвоенного ей? – user2864740

0

Вот мой браузер консоли:

// Bad 
poopy = function(){} 
// function(){} 
groupy = poopy; 
// function(){} 

// Good 
droopy = function loopy(){}; 
// function loopy(){} 
floupy = droopy; 
// function loopy(){} 

Представьте, что вы отладки что-то и у вас есть имя функции с именем groupy. Вы вводите его имя, чтобы получить дополнительную информацию об этом.Если эта функция была установлена ​​как в плохом разделе, вы не знаете, что такое оригинальная декларация. Если, однако, вы определяете имя своей функции, как в разделе «Хороший», тогда вы всегда будете иметь следы исходного имени функции.

Смежные вопросы