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
- Resolver los closures
- Ejecutar métodos de una clase A en un ambito de la clase B
- Crear funciones "virtuales" (algo(function(){},333)) instanciadas para la ejecución en la clase que quieras.
- 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.