entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Quitar el Loop de una Funcion JS

Hola, probando con el JSLint y haciendo fe de las buenas prácticas, me manda un error de que no puedo utilizar "loops" en las funciones, a lo que se me hace correcto, pero no se como hacer esta funcion sin un loop.

Alguna idea?

fixForFirefox = function () {
            var dragItems = document.querySelectorAll('[draggable=true]'),
                i;
            for (i = 0; i < dragItems.length; i + 1) {
                dragItems[i].addEventListener('dragstart', function (event) {
                    event.dataTransfer.setData('Text', this.id);
                }, false);

                dragItems[i].addEventListener('dragend', function (event) {
                });
            }
        },

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola Porfirio,

lo que te debe decir JSLint es que no debés craer funciones dentro de un "loop", que no es lo mismo.

En tu caso, seguramente es por la declaración de las funciones anónimas function (event)

Podrías solucionarlo definiendo la función antes del bucle y luego usándola:

unaFuncion = function (event) {
                    event.dataTransfer.setData('Text', this.id);
                };
for (i = 0; i < dragItems.length; i + 1) {
                dragItems[i].addEventListener('dragstart', unaFuncion, false);
...

y lo mismo con la otra.

Saludos!

PD: no sé si es que estoy viejo, pero he notado en el último par de años un abuso de funciones anónimas en JavaScript, que dificultan la lectura del código y dan problemas de ámbito de variables como se puede ver en varias preguntas aquí mismo... cuando definir una función como toda la vida hubiera hecho evidentes estos problemas.

0voto

elporfirio comentado

Mañana la pruebo;) y califico.

Es una funcion anonima por que pertenece a una clase de Js, de hecho es una privada jiji, por ello la razón de que no sea una función normal. Saludos desde México

0voto

Peter comentado

@elporfirio moví tu respuesta a comentario :)

0voto

Leonardo-Tadei comentado

Hola Porfirio,

cómo que es privada? Si JS no tiene identificadores de ámbito!

Estoy de acuerdo con JSLint en que no es una buena práctica definir una función adentro de un bucle... la solución, como te decía, es simplemente declararla fuera del bucle y luego solo usarla. De esta manera tenés declarada la función solo una vez, en vez de declarar N veces funcines idénticas, con el costo de procesamiento que esto implica.

Saludos!

0voto

elporfirio comentado

gracias, supuestamente le di comentario pero al logguearme creo que se le olvido.

0voto

elporfirio comentado

correcto leonardo-tadei no tiene identificadores.

Pero es posible mantener unos miembros privados :) y otros públicos, es una emulación sencillita.

http://phrogz.net/JS/classes/OOPinJS.html

0voto

Villanuevand comentado

Pues sí, @Leonardo-Tadei en JS es posible emular propiedades y métodos privados. Existen varios patrones de diseños, el que usa @elporfirio es el patrón prototype. Yo en mi caso, uso el patrón "Modulo Revelado" o "Revealing Module".
Cómo aporte me gustaría compartir con ustedes, algunos enlaces que me han ayudado a comprender mucho más JS.
http://ejohn.org/apps/learn/
http://embat.es/post-tecnico/javascript-patrones-de-diseno-en-la-creacion-de-objetos.html
Y por último pero no menos importante
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide

Ojal{a les sea útil... Saludos desde venezuela.

0voto

Leonardo-Tadei comentado

Hola a todos,

es un tema por demás interesante!

Yo no comparto que realmente se puedan ocultar propiedades, porque es algo que el lenguaje simplemente no soporta, a lo sumo, como en el ejemplo que envía Porfirio, se pueden hacer declaraciones inaccesibles, que no es lo mismo.

Por ejemplo, siguiendo el artículo de http://phrogz.net/JS/classes/OOPinJS.html, tal y como explica cuando se hace:

gk.race = "hispanic";                         //Sets a public variable, but does not overwrite private 'race' variable. 
alert(gk+"'s real race is "+gk.getRace());    //Returns 'caucasian' from private 'race' variable set at create time.

Efectivamente devuelve 'caucasian', pero cuando se hace:

alert(gk+" assigned race is "+gk.race); 

devuelve 'hispanic'.

La función getRace() da la ilusión de que no se puede cambiar el atributo, pero el atributo sí cambia: lo que pasa es que para getRace() el valor que puede devolver es únicamente el asignado al momento de la creación y como el parámetro race no tiene ningún punto de acceso, queda fijo.

Lo único que permite JS es con var definir como local el ámbito de una variable, y es por esto que el cambio al alive interno no tiene efecto si se hace gk.alive = false; pero ahora hay dos variables alive coexistiendo y tendrá un valor una u otra dependiendo de cómo se la llame!!!

La cuestión es que para que un lenguaje soporte OO hacen falta: herencia, polimorfismo, binding dinámico, ocultación de la información y recolección de basura: JavaScript no cumple con todos estos mecanismos, porque por ejemplo no hay como hacer para que métodos de una "clase" no puedan acceder a variables declaradas fuera de su propio ámbito.

En fin: estas técnicas me resultan muy interesantes, pero la complejidad que involucran para terminar obteniendo resultados parciales, me parece que no lo valen.

Gracias por los aportes y por la interesante discusión!!!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta