web-dev-qa-db-ja.com

setInterval関数にパラメータを渡す

setIntervalを使って呼ばれる関数にパラメータを渡す方法を教えてください。

私の例setInterval(funca(10,3), 500);は正しくありません。

294
Rakesh

実際の関数がすぐに実行されないように、無名関数を作成する必要があります。

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

eS5では、バインドメソッド

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

ここを参照

70
sbr

それらをパラメータとしてsetIntervalに追加します。

setInterval(funca, 500, 10, 3);

質問の構文ではevalを使用していますが、これはお勧めできません。

51
Kev

パラメータとしてではなく、関数オブジェクトのプロパティとしてパラメータを渡すことができます。

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

それからあなたの関数someFunctionで、あなたはパラメータにアクセスするでしょう。これは、スコープが自動的にグローバル空間に行き、最初にsetIntervalを呼び出したクラスへの参照を失うようなクラスの中では特に便利です。このアプローチでは、上記の例の "someFunction"内の "parameter2"が正しいスコープを持ちます。

30
Juan

無名関数を使うことができます。

setInterval(function() { funca(10,3); },500);
17
Simon
     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
16
manas
setInterval(function,milliseconds,param1,param2,...)

更新日:2018年 - "spread"演算子を使う

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

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

はるかに実用的な答えはtvanfossonによって与えられるものです、私がすることができるすべてはあなたにES6で更新されたバージョンを与えることです:

setInterval( ()=>{ funca(10,3); }, 500);
11
A.rodriguez

引数を引用するだけで十分です。

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

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

各引数の単一引用符'に注意してください。

IE8、ChromeおよびFireFoxでテスト済み

6
waterazu

私はこのトピックが非常に古いことを知っていますが、これは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);
}
1
Kaan Karaca

アンダースコアjsというライブラリを使うことができます。これはbindメソッドにNiceラッパーを与え、同様にずっときれいな構文です。指定されたスコープで関数を実行させます。

http://underscorejs.org/#bind

_.bind(関数、スコープ、引数)

0
Sagar Parikh

これはうまくいくsetInterval("foo(bar)",int,lang);.... Jon Kleiser私を答えに導いてください。

0
Stephen

その問題はクロージャの使用のための良いデモンストレーションになるでしょう。アイデアは、関数が外部スコープの変数を使用するということです。これは一例です...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

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

return ret;
}

関数 "makeClosure"は、外部スコープ変数 "name"へのアクセス権を持つ他の関数を返します。そのため、基本的には、 "makeClosure"関数に任意の変数を渡し、 "ret"変数に割り当てられた関数でそれらを使用する必要があります。影響を受けるので、setIntervalは "ret"に割り当てられた関数を実行します。

0
Aleksey Kanaev

もう1つの解決策は、(ダイナミクス変数がある場合)そのような関数を渡すことです。setInterval( 'funca(' + x + '、' + y + ')'、500);

0
nonozor