在setInterval函数中传递参数

Rak*_*esh 308 javascript parameters setinterval

请告知如何将参数传递给一个名为using的函数setInterval.

我的例子setInterval(funca(10,3), 500);不正确.

tva*_*son 522

您需要创建一个匿名函数,以便不立即执行实际的功能.

setInterval( function() { funca(10,3); }, 500 );
Run Code Online (Sandbox Code Playgroud)

  • @ rony36 - 您可能希望有一个为您创建间隔计时器的功能.将参数传递给函数,以便在函数闭包中捕获其值,并在计时器到期时保留该值.`function createInterval(f,dynamicParameter,interval){setInterval(function(){f(dynamicParameter);},interval); 然后将其称为`createInterval(funca,dynamicValue,500);`显然,你可以为多个参数扩展它.并且,请使用更多描述性变量名称.:) (25认同)
  • 什么应该是动态参数? (4认同)
  • @tvanfosson - 如何清除这种间隔? (3认同)

sbr*_*sbr 74

现在用ES5,bind方法函数原型:

setInterval(funca.bind(null,10,3),500);
Run Code Online (Sandbox Code Playgroud)

参考这里

  • 这是最好的答案,但是根据功能,它可能会出现意外行为。例如``console.log.bind(null)("Log me")`` 会抛出``Illegal invocation``,但是``console.log.bind(console)("Log me")`` 将作为预期的。这是因为 ``console.log`` 需要 ``console`` 作为 ``this`` 参数。 (3认同)
  • 只需添加适用于Chrome> = 7,Firefox> = 4.0,Explorer> = 9,Opera> = 11.60,Safari> = 5.1(来源:https://developer.mozilla.org/ca/docs/Web/JavaScript/参考/ Global_Objects /功能/绑定) (2认同)

Kev*_*Kev 57

将它们作为参数添加到setInterval:

setInterval(funca, 500, 10, 3);
Run Code Online (Sandbox Code Playgroud)

您的问题中的语法使用eval,这不是推荐的做法.

  • 显然这现在适用于IE10(根据上面的mdn) (4认同)
  • 哇?!从什么时候开始允许的?(严肃的问题) (3认同)
  • 没有把握。我的来源是:https://developer.mozilla.org/en/DOM/window.setInterval (2认同)
  • @Kev Internet Explorer是一个真正的混乱它不支持传递参数-.- (2认同)
  • 恕我直言,这应该是公认的答案。漂亮、简单和干净的解决方案。 (2认同)

Jua*_*uan 31

您可以将参数作为函数对象的属性传递,而不是作为参数传递:

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

然后在您的函数中someFunction,您将可以访问参数.这在范围自动转到全局空间的类中尤其有用,并且您将失去对以setInterval开头的类的引用.使用这种方法,在上面的例子中,"someFunction"中的"parameter2"将具有正确的范围.

  • 向对象或函数添加参数会导致编译器变慢,因为它必须重建它的对象的本机代码表示(例如,如果这是在热循环中完成的),所以要小心. (2认同)

man*_*nas 18

     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
Run Code Online (Sandbox Code Playgroud)

  • 最佳解释答案。 (2认同)

Sim*_*mon 17

您可以使用匿名函数;

setInterval(function() { funca(10,3); },500);
Run Code Online (Sandbox Code Playgroud)

  • @Roylee 怎么贵? (3认同)

swo*_*ger 17

setInterval(function,milliseconds,param1,param2,...)
Run Code Online (Sandbox Code Playgroud)

更新:2018年 - 使用"传播"运算符

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

let input = [1,2,3];
setInterval(repeater,3000,...input);
Run Code Online (Sandbox Code Playgroud)


A.r*_*uez 11

到目前为止,最实用的答案是tvanfosson给出的答案,我能做的就是给你一个ES6的更新版本:

setInterval( ()=>{ funca(10,3); }, 500);
Run Code Online (Sandbox Code Playgroud)


Ped*_* GM 7

这个答案的最佳解决方案是下一个代码块:

setInterval(() => yourFunction(param1, param2), 1000);
Run Code Online (Sandbox Code Playgroud)


小智 6

引用参数应该足够了:

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

KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)
Run Code Online (Sandbox Code Playgroud)

请注意'每个参数的单引号.

使用IE8,Chrome和FireFox进行测试

  • 使用eval是一种可怕的做法.使用匿名函数更好. (7认同)