Comunidad de diseño web y desarrollo en internet online

Problema con arguments i funciones adinadas

Citar            
MensajeEscrito el 21 Jul 2008 07:56 pm
Buenas, tengo el siguiente còdigo (si eres elchininet es posible que te suene):

Código :

function load_content (file, target, funciones) {
   var loader:MovieClipLoader = new MovieClipLoader ();
   var listener:Object = new Object ();
   listener.onLoadInit = function (target:MovieClip) {
      for (i = 2; i < arguments.length; i++) {
         arguments[i] ();
      }
   };
   loader.addListener (listener);
   loader.loadClip (file, target);
}

Lo que pretendo es que al producirse el evento onLoadInit se ejecuten las funciones que se hayan pasado como argumentos, no en onLoadInit sinó en load_content. El problema és que arguments recupera los argumentos de onLoadInit. ¿Como puedo recuperar los de load_content desde dentro de onLoadInit?

Muchas gracias

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera
Citar            
MensajeEscrito el 21 Jul 2008 09:23 pm
Agrega

Código :

var listener:Object = new Object ();
listener.funciones = funciones
listener.onLoadInit = function (target:MovieClip) {
  this.funciones()
}


En este caso se supone pasas una función que copias al listener

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 Jul 2008 10:13 pm
ok, muchas gracias! ;)

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera
Citar            
MensajeEscrito el 21 Jul 2008 10:30 pm
Buenas....tengo un problema....yo tengo este código. Pero las acciones que paso como argumentos a load_content, se ejecutan por el solo hecho de estar escritas en el código y en cambio no se ejectuan cuando deberín. ¿Que pasa?

Código :

function load_content (file, target, funciones:Array) {
   var loader:MovieClipLoader = new MovieClipLoader ();
   var listener:Object = new Object ();
   listener.funciones = funciones;
   listener.onLoadInit = function (target:MovieClip) {
      for (i = 0; i < listener.funciones.length; i++) {
         listener.funciones[i] ();
      }
   };
   loader.addListener (listener);
   loader.loadClip (file, target);
}
createEmptyMovieClip("container",33)
load_content ("fotos/foto1.jpg", container, [trace ("Foto1"), trace ("cargada")]);

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera
Citar            
MensajeEscrito el 21 Jul 2008 10:53 pm
¿Y cuando deberían?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 Jul 2008 10:59 pm
Cuando se de el evento onLoadInit

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera
Citar            
MensajeEscrito el 21 Jul 2008 11:05 pm
Si la escribes así

miFuncion()

se ejecuta, si la escribes así:

miFuncion

pasa como referencia

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 Jul 2008 11:07 pm
¿Y entonces como le paso los paràmetros?

Muchas gracias por seguir ayudandome! XD

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera
Citar            
MensajeEscrito el 21 Jul 2008 11:52 pm
Ejemplo, llamo y pido que se ejecute la función hola:

Código :

function ejecuta(arg){
  arg()
}
function hola(){
  trace("Hola amigos")
}
ejecuta(hola)


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 Jul 2008 11:54 pm
Sisi, eso si. Pero y si tienes esto:

Código :

function ejecuta(arg){

  arg()

}

function hola(content){

  trace(content)

}

ejecuta(hola("hello"))


Como le pasas argumentos a hola? Si lo hago así és lo que has dicho antes, se ejecuta en vez de pasrse como referencia.

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera
Citar            
MensajeEscrito el 22 Jul 2008 01:32 am
Sería:

Código :

function ejecuta(arg, que){
  arg(que)
}
function hola(content){
  trace(content)
}
ejecuta(hola("hello"))

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Jul 2008 04:00 pm
Supongo que querías decir:

Código :

ejecuta (hola, que)
;)

El problema está en que la función necesita un número variable de argumentos, no siempre recibe los mismos.

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera
Citar            
MensajeEscrito el 22 Jul 2008 04:07 pm
Nop, quize decir lo que puse, ¿lo probaste?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Jul 2008 04:10 pm
si lo probé, i pasa lo mismo, se ejecuta la función trace cuando no debe.

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

msie
Citar            
MensajeEscrito el 22 Jul 2008 05:40 pm
Por cierto, lo del hola, que tenías razón, aunque funcionara de las dos formas
Bien, para aclarar lo de "se ejecuta cuando no debe"

Así no se ejecuta:

Código :

function ejecuta(arg, que){
  arg(que)
}
function hola(content){
  trace(content)
}


Así si:

Código :

function ejecuta(arg, que){
  arg(que)
}
function hola(content){
  trace(content)
}
ejecuta(hola, "hello")


¿Y porque se ejecuta? Porque la estoy llamando, es decir pongo el nombre de la función, los paréntesis y el argumento.
Siguiente paso: todos los argumentos de una función pasan el el array arguments. Modifico lo anterior pasando n argumentos para armar el String del trace, aunque esto es mas tricky, porque implica el uso de apply, sería así:

Código :

function ejecuta(){   
  var command:Function = arguments[0]
  arguments.splice(0, 1)
  command.apply(this, arguments)
}
function hola(){
  var msg:String = ""
  for(var i=0; i<arguments.length; i++) msg+=arguments[i]+" "
  trace(msg)
}
ejecuta(hola, "hello", "my", "friends")


Esto siempre es posible conociendo los argumentos. En un contexto de clases (no lineal como aquí) implica pensar en un __resolve y en la imposibilidad de overloading (verdadero, estilo Java) en AS. En fin, que es un tema heavy y largamente discutido en las listas de coders

Jorge

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Jul 2008 06:03 pm
Muchas gracias Jorge, la clave era apply ;)

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.