SetInterval işlevinde parametreleri iletme


320

Lütfen parametrelerin using adında bir işleve nasıl iletileceğini belirtin setInterval.

Örneğim setInterval(funca(10,3), 500);yanlış.


2
Sözdizimi:.setInterval(func, delay[, param1, param2, ...]);
O-9

Yanıtlar:


543

Anonim bir işlev oluşturmanız gerekir, böylece gerçek işlev hemen yürütülmez.

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

4
dinamik parametre için ne olmalı?
rony36

28
@ rony36 - muhtemelen sizin için aralık zamanlayıcısını oluşturan bir işleve sahip olmak istersiniz. Parametreyi işleve iletin, böylece değeri işlev kapanmasında yakalanır ve zamanlayıcının süresi dolduğunda kalır. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }Sonra olarak adlandırın createInterval(funca,dynamicValue,500); Açıkçası bunu birden fazla parametre için genişletebilirsiniz. Ve lütfen daha açıklayıcı değişken adları kullanın. :)
tvanfosson

@vanvosson: harika cevap! Fonksiyon içindeki aralık formunu nasıl temizleyeceğinizi biliyor musunuz funca?
Flo

@tvanfosson Teşekkürler. Benim hatam, ama aslında yorum bölümünde verdiğiniz createInterval örneğini kastediyorum. Bunun için nasıl çalışır? Ben de bir zamanlayıcı değişkenini dinamik bir parametre olarak geçirmeyi düşünüyordum, ama bunun nasıl veya mantıklı olduğundan emin değilim. Açıklık sağlamak için buraya yeni bir soru ekledim: stackoverflow.com/questions/40414792/…
Flo

78

şimdi ES5 ile, bind yöntemi Fonksiyon prototipi:

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

Burada referans


2
Bu en iyi yanıttır, ancak işleve bağlı olarak beklenmedik davranışlar gösterebilir. örneğin console.log.bind(null)("Log me")atacak Illegal invocation, ancak console.log.bind(console)("Log me")beklendiği gibi çalışacaktır. Bunun nedeni arg olarak console.loggerektirir . consolethis
Indy

1
En iyi cevap. Yalın ve temiz. Çok teşekkürler!
Tobi

Çok temiz ve verimli!
contactmatt

2
Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 (Kaynak: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/… )
Roger Veciana

60

SetInterval'a parametre olarak ekleyin:

setInterval(funca, 500, 10, 3);

Sorunuzdaki sözdizimi, önerilen uygulama olmayan eval'i kullanıyor.


2
Whaa ?! Ne zamandan beri izin verildi? (ciddi soru)
Crescent Fresh


2
@Kev Internet Explorer gerçek bir karışıklık Geçiş argümanlarını desteklemiyor -.-
ShrekOverflow

1
IMHO bu kabul edilen cevap olmalı. Güzel, basit ve temiz bir çözüm.
LightMan

32

Parametreleri parametre olarak değil, fonksiyon nesnesinin bir özelliği olarak iletebilirsiniz:

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

Daha sonra fonksiyonunuzda someFunctionparametrelere erişebilirsiniz. Bu, özellikle kapsamın global alana otomatik olarak girdiği ve setInterval adlı sınıfa başlamak için sınıfta referansları kaybettiğiniz sınıflar içinde faydalıdır. Bu yaklaşımla, yukarıdaki örnekte, "someFunction" içindeki "parametre2" doğru kapsama sahip olacaktır.



2
Bir nesneye veya işleve parametre eklemek, derleyicinin nesnenin yerel kod temsilini (örneğin, sıcak döngüde yapıldıysa) yeniden oluşturması gerektiğinden yavaşlamasına neden olabilir, bu yüzden dikkatli olun.
mattdlockyer

22
     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

En iyi açıklama cevabı.
Drk_alien

Peki neden argümanları diziler olarak iletelim? Bu detay soru ile bile ilgili değil.
user4642212

18

Anonim bir işlev kullanabilirsiniz;

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

1
bu oldukça pahalı bir telefon!
Roy Lee

2
@Roylee Nasıl pahalı?
user4642212

18
setInterval(function,milliseconds,param1,param2,...)

Güncelleme: 2018 - "spread" operatörünü kullanın

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

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


Bu çok daha iyi.
Uğur Kazdal

Bu çok daha iyi.
Uğur Kazdal

11

Şimdiye kadar en pratik cevap tvanfosson tarafından verilen cevaptır, yapabileceğim tek şey size ES6 ile güncellenmiş bir sürüm vermektir:

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

1
() => {}, ES6'nın () {} işlevini değiştirmenin yeni yolu olduğunu mu söylüyorsunuz? İlginç. İlk olarak, roketlerin passe olduğunu düşündüm. Ve bu sözdiziminin başka yaygın kullanımları yoksa, sadece çok, çok tuhaf. Görüyorum ki "şişman oklar". Yine de tuhaf. Sanırım birisi bunu seviyor ve bu bir fikir meselesi.
Richard_G

6

Argümanlardan alıntı yapmak yeterli olmalıdır:

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

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

'Her bir bağımsız değişken için tek tırnak işaretini not edin .

IE8, Chrome ve FireFox ile test edildi


7
Eval kullanmak korkunç bir uygulamadır. Anonim işlevin kullanımı çok daha iyidir.
SuperIRis

1

Bu konunun çok eski olduğunu biliyorum ama burada parametreler setIntervalişlevde geçen hakkında benim çözüm .

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);
}

i işlevi çağırırken bir değere erişmek gerekir, ama her saniye, böylece cevabınız bu, (örneğin timer) sağlar, ama clearInterval()bu senaryoda nasıl ?
user1063287

0

Bu işe yararsetInterval("foo(bar)",int,lang); .... Jon Kleiser beni cevaba götürdü .


0

Başka bir çözüm, işlevinizi şu şekilde geçirmekten oluşur (dinamikleriniz varsa): setInterval ('funca (' + x + ',' + y + ')', 500);


0

Alt çizgi js adlı bir kitaplık kullanabilirsiniz. Bağlama yönteminde güzel bir sarıcı verir ve aynı zamanda çok daha temiz bir sözdizimidir. İşlevi belirtilen kapsamda yürütmenize izin verir.

http://underscorejs.org/#bind

_.bind (işlev, kapsam, * bağımsız değişkenler)


0

Bu sorun, kapakların kullanımı için güzel bir gösteri olacaktır. Fikir, bir fonksiyonun dış kapsam değişkenini kullanmasıdır. İşte bir örnek...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

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

return ret;
}

"MakeClosure" işlevi, "name" dış kapsam değişkenine erişimi olan başka bir işlev döndürür. Yani, temel olarak, "makeClosure" işlevini kullanmak için hangi değişkenleri geçmeniz ve bunları "ret" değişkenine atanmış işlevde kullanmanız gerekir. Etkileyici bir şekilde, setInterval "ret" işlevine atanan işlevi yürütür.


0

Vue uygulamasıyla aynı sorunu yaşadım. Benim durumumda bu çözüm, anonim işlev mounted ()yaşam döngüsü kancasındaki bildirimle ilgili olarak ok işlevi olarak bildirilmişse çalışır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.