2010-02-18 26 views
11

Bu gibi bir kod vardır:setTimeout için verilen işlev ne ile çağırılır?

function foo(a) { alert(a); /* bars */ } 

attı:

function foo() { /* bars */ } 

Ancak, aşağıdaki yapıyor:

setTimeout(foo, 600); 

Hep foo tüm argümanların örn almadı düşündüm -7 görüntülenen bir uyarı kadar. Bu numara neyi temsil ediyor?

+1

Harika soru! Bunu daha önce denemeyi hiç düşünmemiştim. – Nicole

cevap

8

Bu, zaman aşımına uğradığında ve çalıştığı zamanın zaman farkından (milisaniye cinsinden) farklıdır.

alert(setTimeout(function(a) { alert(a) }, 2000)); 

zamanında ilk uyarısı temizlerseniz, bir sonraki uyarı yerlerdedir -10 10'a sen, 2000 eksi bekledi süre etrafında bir şey göreceksiniz birkaç saniye bekleyin göreceksiniz.

SetInterval için de aynı şey görülebilir. Firebug'da aşağıdakileri çalıştırın:

Uyarıyı hızla kapatmayı deneyin, tekrar 0 civarında olacaktır. Açık bırakın - size büyük bir değer verecektir. Javascript işlenmesini ortadan kaldıracak açık bir uyarı tutarak, bu yüzden uyarı kapatana kadar zamanlayıcı yürütmüyor burada Firefox Mac üzerindedir

Not. Yukarıdaki testlerin davranışı, diğer tarayıcılarda farklı olabilir

+0

yep .. Burada çok küçük bir şekilde belgelenmiştir: https://developer.mozilla.org/en/DOM/window.setTimeout. sadece bir firefox-only şey gibi görünüyor – Claudiu

+0

Çok akıllı bir özellik, utanç IE de yok. Sonra tekrar utanç IE çok şey yok :-) –

+1

@Andy E Eğer https://bugzilla.mozilla.org/show_bug.cgi?id=394769 bakarsanız oldukça tartışma var gibi görünüyor onun varlığı, çünkü setTimeout tarafından çağrılan isteğe bağlı argümanlar ile fonksiyonların kullanılabilirliğini azaltır. – Nicole

3

Neyi anlayabildiğimden ... zamanlama, planlandığı zaman ile gerçekte milisaniyede çalıştırıldığı zaman arasındaki farktır. İlginçtir ki, ... sıfırların

<script> 
var a = setInterval(foo, 125); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

irade çıkışı bir grup, aynı, 500, 250 için 1000 giderse ... tüm saniye bile fraksiyonları gibi belirli tarayıcıların görünüyor

<script> 
var a = setInterval(foo, 127); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

irade çıkışı sırasında

-2 
12 
-6 
8 
-10 
4 
2 
0 
-2 
-4 
9 
-8 
5 
3 
1 
İlgili konular