Pergunta

Eu quero passar uma matriz de objeto para a função SetTimer em Javascript.

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

estou recebendo erro neste código.

Nota **: ** Desculpe! alguma correção na minha pergunta:. É possível em setInterval () function

Foi útil?

Solução

Use uma função anônima em vez de uma corda no primeiro parâmetro do setTimeout ou setInterval funções:

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

Por que funciona:

Quando você define uma função interna, pode referir-se a variáveis ??presentes em sua função envolvendo exterior mesmo depois de suas funções controladoras já encerrado.

Este recurso de linguagem é chamado fechamentos .

Se você passar uma string como primeiro argumento destas funções, o código será executado internamente usando uma chamada para o eval função, e fazer isso é não considerado como um boas práticas .

Eval fornece acesso direto para o compilador JavaScript e executa o código é passado com os privilégios do chamador, também usando eval repetidamente / extensivamente (ou seja, sua função setInterval é um bom exemplo) vai levar a problemas de desempenho.

Outras dicas

Eu estou indo para expandir a resposta de Lucas aqui, pois ele aborda um caso de uso que do CMS (e mais respostas para esse tipo de pergunta) não.

Se você precisa vincular seus argumentos para a chamada de função no momento em que definir o tempo limite , um gabinete de função simples não vai 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);

Assumindo que você está usando o console do Firebug, a saída vontade acima de "A imediata", "imediata B" e depois "imediato B" 1 segundo depois. Para vincular o valor no momento do método armadilha do uso chamada setTimeout de Lucas. Os seguintes modifica um pouco a aceitar funções arbitrárias e comprimentos argumento:

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);

Não tenho certeza se há uma maneira de passar o contexto do chamador em implicitamente, mas poderia ser expandida para aceitar um argumento contexto, se "isto" não chegar lá.

Primeiro, é 'setTimeout'

Em segundo lugar, não passa uma corda. A solução real depende do resto do código. Maneira mais robusta seria a armadilha do escopo:

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

armadilha retorna uma função que tem sua matriz preso em seu escopo. Esta é uma função genérica, mas para torná-lo específico para o seu problema, ele pode ser simplificada:

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

ou mesmo:

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

e, finalmente condensado para baixo:

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

EDIT: As minhas funções (ou pelo menos uma iteração deles eu achei em um backup aqui)

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);

ou 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top