Ver Mensaje Individual
  #6 (permalink)  
Antiguo 09/08/2007, 14:06
Avatar de MaBoRaK
MaBoRaK
 
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 10 meses
Puntos: 35
Re: setTimeout en objeto

loading.............

Cita:
Si escribimos en String "oThis.BB()" no funcionará, y si la función de dentro del setTimeout la sacamos fuera (con un nombre) tampoco funcionara. Es que, como ves, no entiendo muy bien el ámbito de la variable oThis. Está disponible para todo el método BB(), ¿y cómo es que está disponible después en cualquier momento para el setTimeout()? Si es de ámbito global
Pasa que si haces var oThis=this; no es una variable global sinó local es por eso que si en settimeout llamas a a una funcion "virtual" y dentro a Othis, primero busca en las variables locales (variables dentro de un método) y luego directamente en window asi que si pones la funcion fuera de la clase entonces buscará directamente en window.
Cita:
, ¿por qué entonces si añadimos una nueva instancia de AA() no se sobreescribe?
Porque en cada nueva instancia los métodos tienen nuevas variables locales.

Algo que podría servirte es esto:

Código PHP:
 var closure=function(options)
 {
         var 
method      =options.method;
         var 
instance=options.instance;
         var 
args        =(options.args || (typeof options.args=="number" && options.args===0))?options.args:false;
         var 
_function=options.Function || false;
         var 
isArr       =options.args_is_array || false;
         var 
_event      =options.event || false;
         var 
rf          =options.Return || false;
         return function(
hEvent)
         {
                 var 
argss=(args===false)?false:((args.isArray && isArr===false)?args:[args]);
                 var 
param=(_event)?[(hEvent || window.event)].concat(argss):argss;
                 if(
_function===false)
                 {
                         
method.apply(instance,param || [null]);
                 }
                 else
                 {
                         
_function.apply(_function,param || [null]);
                 }
                 return 
rf;
         };
 }; 
Con esta función puedes
  1. Resolver los closures
  2. Ejecutar métodos de una clase A en un ambito de la clase B
  3. Crear funciones "virtuales" (algo(function(){},333)) instanciadas para la ejecución en la clase que quieras.
  4. llamar a funciones/métodos con parámetros

Documentación.
Código:
 @param {Object} options = {
               method  :Method,
               instance:Instance,
               Function:Function,
               arguments:Array["sample",var,222]
               event   :true || false,                 #Expand event?
               argument_is_array:true || false         #Arguments is Array?
       } Options
Samples

Llamar a una funcion con parámetros
Código PHP:
var algo=function(parametro){alert(parametro)};
objetoDOM.onclick=closure({Function:algo,args:232323}); 
Ejecutar métodos de una clase A en un ambito de la clase B
Código PHP:
var algo=function(parametro){alert("esta funcion se ejecuta como parte de la clase A")};
objetoDOM.onclick=closure({instance:classA,method:algo,args:232323}); // con un solo parametro
objetoDOM.onclick=closure({instance:classB,method:classB.algunMethod,args:[1,2,3,4,5]}); // con 5 parámetros 
SI usas eventos necesitaras en mozilla expandir el evento
Código PHP:
var algo=function(parametro){alert("esta funcion se ejecuta como parte de la clase A")};
objetoDOM.onclick=closure({instance:classA,method:algo,args:232323}); // con un solo parametro
objetoDOM.onclick=closure({instance:classB,method:classB.algunMethod,args:[1,2,3,4,5],event:true}); // con 5 parámetros 
Y otros usos mas....

Y se puede resumir esta funcion a un prototipo de Function. que alguien lo haga :p



connection closed.
__________________

Maborak Technologies