2010-08-11 39 views
22

Estaba leyendo que usar funciones anónimas en javascript es una mala práctica, porque puede hacer que la depuración sea un problema, pero no he visto esto por mí mismo. ¿Las funciones anónimas en JavaScript son una mala práctica y, de ser así, por qué?¿Las funciones anónimas son una mala práctica en JavaScript?

+0

Las funciones anónimas/lambda son una característica central de la programación funcional. Puede obtener más información al respecto aquí: http://www.youtube.com/results?search_query=cs61a&aq=f – cbednarski

+0

Las herramientas de desarrollo y las estrategias de compilación/módulo han recorrido un largo camino desde 2010 ... Chrome/WebKit son realmente buenas, FireBug es regular, pero adecuado (y nombrar la expresión de la función también puede ayudar visualmente). De todos modos, teniendo en cuenta la gran cantidad de veces que se utilizan, este es un axioma dudoso, posiblemente relacionado con un código que era "demasiado inteligente" y difícil de seguir/depurar para empezar ... porque nunca sentí dolor depurando _mi_ código ;-) – user2864740

Respuesta

12

No, las funciones anónimas se utilizan en todo el lugar en JavaScript en la web. Puede hacer que la depuración sea un poco más difícil en algunos puntos, pero no tanto como para decir que no deberían usarse.

Por ejemplo, JQuery hace un uso extensivo de ellas.

Hay muchas ocasiones en que desea usarlas en lugar de las funciones formalmente declaradas, como cuando quiere limitar su alcance.

+6

En realidad, esta es una razón por la que he dejado de usar jQuery. Siempre me llevó mucho más tiempo del que creía razonable determinar si un error era un error de sintaxis en mi código, un error lógico en mi código, o algo malo con jQuery. Tienes que admitir que una pila de llamadas de funciones anónimas no hace las cosas tan terriblemente claras de un vistazo como lo hace una de las funciones nombradas. – Kev

+6

Siempre puede usar una [expresión de función nombrada] (http://yura.thinkweb2.com/named-function-expressions/#named-expr). –

7

Yo diría lo contrario, lambdas (alias) hace algunas expresiones mucho más concisas. Si vincula varios manejadores de eventos a múltiples eventos, sería tedioso dar un nombre de función a cada manejador de eventos, por ejemplo.

Es más útil y conserva el tiempo que no, incluso si hace que la depuración sea un poco más difícil, pero rara vez me cuesta depurarme porque una función es anónima. Y debe usar JSLint para hacer su vida más fácil al codificar.

5

Definitivamente no, las funciones de lambda se usan por todo el lugar, casi omnipresentes.

+16

El hecho de que algo sea _common_ no significa que sea _correcto_. Puede que no haya nada de malo en usar funciones anónimas, pero decir: "Todo el mundo lo hace" no constituye un argumento válido. –

+0

sass profundamente anidado está por todos lados, pero está completamente equivocado –

-3

Expresiones de funciones anónimas son mejor práctica de en JavaScript.

+3

Reclamación rechazada por falta de soporte. – user2864740

+4

Downvoted debido a la falta de WHY. También porque la práctica * común * no es necesariamente la * mejor * práctica. –

4

El hecho de que todos los usen no los convierte en una buena práctica (todo el mundo recuerda usar el elemento de la tabla para el diseño?). Pero son geniales porque pueden ayudarlo a aclarar y simplificar su código, dando menos oportunidades para que algo salga mal.

Pero, las funciones anónimas no deben ser tan complicadas que la depuración se vuelve difícil con ellas. En ese caso, tal vez es mejor hacer una nueva función.

+3

Siempre puede usar una [expresión de función nombrada] (http://yura.thinkweb2.com/named-function-expressions/#named-expr). –

+3

+1 para el código de lemming –

+1

@MarcelKorpel: El enlace que proporcionó ha muerto, pero supongo que quiere decir que puede agregar opcionalmente un nombre a su función anónima (que ya no sea anónima) como esta: 'var fAnonymous = (function nonAnon () {}); '. Esto ciertamente podría ayudar con la depuración. – palswim

8

Voy a ir un poco en contra de la corriente aquí y defiendo que las funciones anónimas son de hecho malas prácticas a pesar de que son ampliamente utilizadas.

1) Las funciones anónimas no pueden reutilizarse.

2) Las funciones anónimas, por definición, no tienen nombre, por lo que no describen lo que hacen. Lo que quiere decir que el código no es auto documentado.

3) Las funciones anónimas no se pueden probar de forma aislada con un marco de prueba de unidades.

4) Personalmente creo que hacen que el código sea más difícil de leer y depurar. Aunque tu experiencia puede variar

Creo que hay situaciones en las que una función anónima es la mejor opción y, como regla general, para evitar las desventajas anteriores, casi siempre nombro mis funciones.

+2

1) Las funciones anónimas y los cierres pueden reutilizarse, cada función tiene valor y puede asignarse a una variable o suministrarse como un argumento de función; solo se trata de exponer el objeto-función en el nivel/alcance correcto; 2) Las funciones anónimas (o expresiones de funciones) _se_ pueden recibir nombres explícitos, pero son "anónimas" en el contexto; 3) Depende de qué se prueba, cómo se prueba y cómo se exponen los objetos de la función; 4) Cierres/lambdas pueden ser abusados ​​en casos de "demasiada astucia", pero los "codificadores terribles son codificadores terribles", incluso con los enunciados de código de procedimiento más triviales. – user2864740

+0

Estoy confundido por lo que dices aquí. Si asigna un nombre a una función y la asigna a una variable, ¿no es, por definición, una función anónima? ¿Podría dar un ejemplo de anónimo con un nombre? – bhspencer

+0

El problema es que el término función "anónimo" es una mentira. El término real debe ser * expresión de función * o * cierre * o incluso * lambda * (esto difiere de una declaración de función de nivel superior "o" método "). Porque, ¿cómo se puede usar una función "anónima" (excepto un IIFE) sin * algún * nombre que se le haya asignado? – user2864740

0

Aquí es mi consola navegador:

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

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

Imagínese que está depurando algo y usted tiene un nombre de función llamada groupy. Escribe su nombre para obtener más información sobre él.Si esa función se ha establecido como en la sección incorrecta, no tiene idea de cuál era la declaración original. Sin embargo, si define su nombre de función, como en la sección Bueno, entonces siempre tendrá un rastro del nombre de la función original.

Cuestiones relacionadas