Jawaban:
Anda perlu membuat fungsi anonim sehingga fungsi sebenarnya tidak segera dijalankan.
setInterval( function() { funca(10,3); }, 500 );
function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }
Kemudian menyebutnya sebagai createInterval(funca,dynamicValue,500);
Jelas Anda dapat memperpanjang ini untuk lebih dari satu parameter. Dan, tolong, gunakan nama variabel yang lebih deskriptif. :)
funca
?
sekarang dengan ES5, ikat metode Prototipe fungsi:
setInterval(funca.bind(null,10,3),500);
console.log.bind(null)("Log me")
akan melempar Illegal invocation
, tetapi console.log.bind(console)("Log me")
akan bekerja seperti yang diharapkan. Ini karena console.log
memerlukan console
sebagai this
argumen.
Tambahkan mereka sebagai parameter ke setInterval:
setInterval(funca, 500, 10, 3);
Sintaks dalam pertanyaan Anda menggunakan eval, yang bukan praktik yang disarankan.
Anda dapat melewatkan parameter sebagai properti dari objek fungsi, bukan sebagai parameter:
var f = this.someFunction; //use 'this' if called from class
f.parameter1 = obj;
f.parameter2 = this;
f.parameter3 = whatever;
setInterval(f, 1000);
Kemudian dalam fungsi someFunction
Anda, Anda akan memiliki akses ke parameter. Ini sangat berguna di dalam kelas di mana ruang lingkup pergi ke ruang global secara otomatis dan Anda kehilangan referensi ke kelas yang disebut setInterval untuk memulai. Dengan pendekatan ini, "parameter2" di "someFunction", dalam contoh di atas, akan memiliki cakupan yang tepat.
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
Anda dapat menggunakan fungsi anonim;
setInterval(function() { funca(10,3); },500);
setInterval(function,milliseconds,param1,param2,...)
Pembaruan: 2018 - gunakan operator "spread"
function repeater(param1, param2, param3){
alert(param1);
alert(param2);
alert(param3);
}
let input = [1,2,3];
setInterval(repeater,3000,...input);
Sejauh ini jawaban yang paling praktis adalah yang diberikan oleh tvanfosson, yang bisa saya lakukan adalah memberi Anda versi terbaru dengan ES6:
setInterval( ()=>{ funca(10,3); }, 500);
Mengutip argumen harus cukup:
OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)
KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)
Catat kutipan tunggal '
untuk setiap argumen.
Diuji dengan IE8, Chrome dan FireFox
Saya tahu topik ini sudah sangat tua tetapi ini adalah solusi saya untuk melewatkan parameter dalam setInterval
fungsi.
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
), tetapi bagaimana Anda clearInterval()
dalam skenario ini?
Solusi lain terdiri atas fungsi Anda seperti itu (jika Anda punya dinamika vars): setInterval ('funca (' + x + ',' + y + ')', 500);
Anda dapat menggunakan perpustakaan yang disebut underscore js. Ini memberikan pembungkus yang bagus pada metode bind dan sintaks yang jauh lebih bersih juga. Memungkinkan Anda menjalankan fungsi dalam cakupan yang ditentukan.
_.bind (fungsi, lingkup, * argumen)
Masalah itu akan menjadi demonstrasi yang bagus untuk penggunaan penutupan. Idenya adalah bahwa suatu fungsi menggunakan variabel lingkup luar. Berikut ini sebuah contoh ...
setInterval(makeClosure("Snowden"), 1000)
function makeClosure(name) {
var ret
ret = function(){
console.log("Hello, " + name);
}
return ret;
}
Fungsi "makeClosure" mengembalikan fungsi lain, yang memiliki akses ke "nama" variabel lingkup luar. Jadi, pada dasarnya, Anda perlu meneruskan variabel apa pun untuk fungsi "makeClosure" dan menggunakannya dalam fungsi yang ditetapkan untuk variabel "ret". Secara efektif, setInterval akan menjalankan fungsi yang ditetapkan untuk "ret".
Saya memiliki masalah yang sama dengan aplikasi Vue. Dalam kasus saya, solusi ini hanya berfungsi jika fungsi anonim telah dideklarasikan sebagai fungsi panah, terkait deklarasi di mounted ()
hook lingkaran kehidupan.
.setInterval(func, delay[, param1, param2, ...]);