Como passar um objeto Array para a função setInterval
-
16-09-2019 - |
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
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);