回答:
実際の関数がすぐに実行されないように、無名関数を作成する必要があります。
setInterval( function() { funca(10,3); }, 500 );
function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }
次に、createInterval(funca,dynamicValue,500);
これを複数のパラメーターに拡張できることは明らかです。そして、もっとわかりやすい変数名を使用してください。:)
funca
か?
console.log.bind(null)("Log me")
スローしますがIllegal invocation
、console.log.bind(console)("Log me")
期待どおりに動作します。これは、console.log
必要とconsole
としてthis
argを。
それらをパラメータとしてsetIntervalに追加します。
setInterval(funca, 500, 10, 3);
質問の構文ではevalを使用していますが、これは推奨される方法ではありません。
パラメーターとしてではなく、関数オブジェクトのプロパティとしてパラメーターを渡すことができます。
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」が適切なスコープになります。
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
無名関数を使用できます。
setInterval(function() { funca(10,3); },500);
setInterval(function,milliseconds,param1,param2,...)
更新:2018-「スプレッド」演算子を使用
function repeater(param1, param2, param3){
alert(param1);
alert(param2);
alert(param3);
}
let input = [1,2,3];
setInterval(repeater,3000,...input);
これまでで最も実用的な答えは、tvanfossonによって与えられたものです。私ができることは、ES6で更新されたバージョンを提供することだけです。
setInterval( ()=>{ funca(10,3); }, 500);
引数を引用するだけで十分です:
OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)
KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)
'
各引数の単一引用符に注意してください。
IE8、Chrome、FireFoxでテスト済み
私はこのトピックが古すぎることを知っていますが、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);
}
timer
:)がclearInterval()
、このシナリオではどのように行うのですか?
アンダースコアjsというライブラリを使用できます。bindメソッドに素敵なラッパーを提供し、構文もずっとすっきりしています。指定したスコープで関数を実行できます。
_.bind(関数、スコープ、*引数)
この問題は、クロージャーを使用するための素晴らしいデモになります。アイデアは、関数が外部スコープの変数を使用することです。ここに例があります...
setInterval(makeClosure("Snowden"), 1000)
function makeClosure(name) {
var ret
ret = function(){
console.log("Hello, " + name);
}
return ret;
}
関数「makeClosure」は、外部スコープ変数「name」にアクセスできる別の関数を返します。したがって、基本的には、「makeClosure」関数に変数を渡し、「ret」変数に割り当てられた関数でそれらを使用する必要があります。影響すると、setIntervalは「ret」に割り当てられた関数を実行します。
Vueアプリでも同じ問題が発生しました。私の場合、この解決策は、mounted ()
ライフサークルフックでの宣言に関して、無名関数が矢印関数として宣言されている場合にのみ機能します。
.setInterval(func, delay[, param1, param2, ...]);