Pregunta

Quiero pasar un array objeto a la función SetTimer en Javascript.

setTimer("foo(object_array)",1000);

estoy recibiendo error en el código.

** Nota: ** Lo sentimos! cierta corrección en mi pregunta: ¿Es posible en función setInterval ()

.
¿Fue útil?

Solución

Utilice una función anónima en lugar de una cadena en el primer parámetro de la setTimeout o setInterval funciones:

// assuming that object_array is available on this scope
setInterval(function () { foo(object_array); }, 1000);

¿Por qué funciona:

Cuando se define una función interna, se puede hacer referencia a las variables presentes en su la función de cerramiento exterior, incluso después de que sus funciones de padres ya han terminado.

Esta característica del lenguaje se llama cierres .

Si pasa una cadena como el primer argumento de estas funciones, el código se ejecutará internamente mediante una llamada a la eval función, y haciendo esto es no considerado como un buenas prácticas .

Eval proporciona acceso directo al compilador de JavaScript y ejecuta el código que ha pasado con los privilegios de la persona que llama, también usando eval varias veces / extensivamente (es decir, su función setInterval es un buen ejemplo) dará lugar a problemas de rendimiento.

Otros consejos

Voy a ampliar la respuesta de Lucas aquí porque se refiere a un caso de uso que CMS (y la mayoría de las respuestas a este tipo de preguntas) no lo hace.

Si necesita unir sus argumentos para la llamada de función en el momento de configurar el tiempo de espera , un simple recinto función no funcionará:

echo = function (txt) { console.log(txt); };

val = "immediate A";
echo(val);

val = "delayed";
window.setTimeout(function () { echo(val); }, 1000);

val = "immediate B";
echo(val);

Si se asume que está utilizando la consola de Firebug, lo anterior es la salida "Un inmediata", "B inmediata" y luego "inmediata B" 1 segundo después. Para enlazar el valor en el momento del método de captura de llamada setTimeout el uso de Luke. El siguiente modifica un poco para aceptar funciones arbitrarias y longitudes de argumentos:

echo = function (txt) { console.log(txt); };

trap = function (fn, args) {
    return function() {
        return fn.apply(this, args);
    };
};

val = "immediate A";
echo(val);

val = "delayed";
window.setTimeout( trap(echo, [val]), 1000);

val = "immediate B";
echo(val);

No estoy seguro si hay una manera de pasar el contexto del llamador en forma implícita, pero podría ampliarse aún más para aceptar un argumento contexto si "esto" no te lleva allí.

En primer lugar, es 'setTimeout'

En segundo lugar, no deje pasar una cadena. La verdadera solución depende del resto del código. La mayor parte de forma robusta sería controlar la extensión:

var obj_array = something;
function trap(obj)
{
    function exec() { foo(obj); }
    return exec;
}
setTimeout(trap(obj_array), 1000);

trampa devuelve una función que tiene la matriz atrapado en su ámbito de aplicación. Esta es una función genérica, pero para que sea específico para su problema, puede simplificarse:

var obj_array = something;
function trap()
{
    function exec() { foo(obj_array); }
    return exec;
}
setTimeout(trap(), 1000);

o incluso:

var obj_array = something;
function trap()
{
    foo(obj_array);
}
setTimeout(trap, 1000);

y, finalmente, se condensó a:

var obj_array = something;
setTimeout(function() { foo(object_array); }, 1000);

EDIT: Mis funciones (o por lo menos 1 iteración de ellos he encontrado en una copia de seguridad aquí)

Function.prototype.createDelegate = function(inst, args) { 
    var me = this;
    var delegate = function() { me.apply(inst, arguments); }
    return args ? delegate.createAutoDelegate.apply(delegate,args) : delegate;
};
Function.prototype.createAutoDelegate = function() {
    var args = arguments;
var me = this;
return function() { me.apply({}, args); }
};

dado:

function test(a, b) { alert(a + b); }

USO:

setTimeout(test.createAutoDelegate(1, 2), 1000);

O dado:

var o = { a:1, go : function(b) { alert(b + this.a); }}

USO:

setTimeout(o.go.createDelegate(o,[5]), 1000);
//or
setTimeout(o.go.createDelegate(o).createAutoDelegate(5), 1000);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top