Pergunta

Por favor, informe como passar parâmetros para uma função chamada usando setInterval.

Meu exemplo setInterval(funca(10,3), 500); está incorreto.

Foi útil?

Solução

Você precisa criar uma função anônima para que a função real não é executada imediatamente.

setInterval( function() { funca(10,3); }, 500 );

Outras dicas

agora com ES5, método ligam protótipo Função:

setInterval(funca.bind(null,10,3),500);

referência aqui

Adicionar-los como parâmetros para setInterval:

setInterval(funca, 500, 10, 3);

A sintaxe na sua pergunta usos eval, que não é uma prática recomendada.

Você pode passar o parâmetro (s) como uma propriedade do objeto função, não como um parâmetro:

var f = this.someFunction;  //use 'this' if called from class
f.parameter1 = obj;
f.parameter2 = this;
f.parameter3 = whatever;
setInterval(f, 1000);

Então em seu someFunction função, você terá acesso aos parâmetros. Isto é particularmente classes dentro úteis onde o escopo vai para o espaço global automaticamente e você perde as referências à classe que chamou setInterval para começar. Com esta abordagem, "parâmetro2" em "someFunction", no exemplo acima, terão o escopo direita.

     setInterval(function(a,b,c){

          console.log(a + b +c);  

      }, 500, 1,2,3);

           //note the console will  print 6
          //here we are passing 1,2,3 for a,b,c arguments
         // tested in node v 8.11 and chrome 69

Você pode usar uma função anônima;

setInterval(function() { funca(10,3); },500);
setInterval(function,milliseconds,param1,param2,...)

Update: 2018 - usar o operador "propagação"

function repeater(param1, param2, param3){
   alert(param1);
   alert(param2);
   alert(param3); 
}

let input = [1,2,3];
setInterval(repeater,3000,...input);

De longe a resposta mais prática é aquela dada por tvanfosson, tudo que posso fazer é dar-lhe uma versão atualizada com ES6:

setInterval( ()=>{ funca(10,3); }, 500);

Citando os argumentos deve ser suficiente:

OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)

KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)

Observe a citação ' único para cada argumento.

Testado com o IE8, Chrome e Firefox

Eu sei que este tema é tão antigo, mas aqui é a minha solução sobre a passagem de parâmetros em função setInterval.

HTML:

var fiveMinutes = 60 * 2;
var display = document.querySelector('#timer');
startTimer(fiveMinutes, display);

JavaScript:

function startTimer(duration, display) {
    var timer = duration,
        minutes, seconds;

    setInterval(function () {
        minutes = parseInt(timer / 60, 10);
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds;
        --timer; // put boolean value for minus values.

    }, 1000);
}

Esta setInterval("foo(bar)",int,lang); obras .... Jon Kleiser me levar à resposta.

Outra solução consiste em passar a função assim (se você tem dinâmica VARs): setInterval ( 'funca (' + x + ' ' + y +')', 500);

Você pode usar uma biblioteca chamada sublinhado js. Ele dá um invólucro agradável no método ligar e é uma sintaxe mais limpa muito bem. Permitindo-lhe executar a função no escopo especificado.

http://underscorejs.org/#bind

_. Bind (de função, o escopo, * argumentos)

O problema seria uma boa demonstração para uso de encerramentos. A idéia é que uma função usa uma variável de escopo externo. Aqui está um exemplo ...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

ret = function(){
    console.log("Hello, " + name);
}

return ret;
}

Função "makeClosure" retorna outra função, que tem acesso ao "nome" escopo externo variável. Então, basicamente, você precisa passar em quaisquer variáveis ??de função "makeClosure" e usá-los em função atribuída a variável "ret". Afetuosamente, setInterval irá executar a função atribuída a "ret".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top