2011-12-12 12 views
5

Farklı tarayıcı zamanlayıcıları nedeniyle farkın şu anda önemsiz olduğunu biliyorum, ancak başka bir şey yoksa bilgi için: setInterval ve setTimeout'u destekleyen herhangi bir tarayıcı var mı, yoksa gecikme olarak bir tamsayı değeri mi gerektiriyor? Bu gibi uyumlu çapraz tarayıcı olarakSetInterval veya setTimeout kesirli bir gecikme geçmek güvenli midir?

setInterval(animate,50/3); 

: örneklerle rephrased

Veya, bu nedir?

setInterval(animate,17); 
+0

Tanımlandığı şekilde ikinci argüman "milisaniye sayısı" dır. Şimdi, eğer bu sayı doğal olarak tanımlanmış değilse ... –

+0

@ ŠimeVidas Mükemmel bir şekilde tanımlanmıştır. DOM spesifikasyonuna bakın ;-) –

cevap

6

Bu çok güvenlidir. ancak hiçbir başvuru için kesin beyan etmesini - - ToInteger olduğunu.

(RobG işaret ettiği gibi, ben kendilerini DOM/JS köprü kurallarına başvuru sağlamaz ve o, inanıyorum dikkatli FWIW çağrısı

Arabirim köprüsünün bir parçası Burada, bir dize, bir kayan nokta ve bir integral (JS'de kayan ile aynı türde) FF8 ve IE9'da iyi çalışan bir zaman aşımı olarak gösterilen bir jsfiddle belirtilmiştir.

setTimeout/setInterval - yup'daki gecikme için the DOM interface only accepts integers olduğundan, bunlar ECMAScript'te değil DOM'de tanımlanmıştır. Gecikme değeri ilk olarak uygun bir şekilde bir integral değere dönüştürülür (ve bu bakımdan [JS-internal] ToInteger işlevi, *) kesme işlemini gerçekleştiren çağrılır. ve 17farklı zaman aşımları belirtmek -

Ancak örnek numaraları aslında

:-) biraz farklı sonuçlar (farkedilir olmayabilir rağmen) Bu 50/3 (>1616.66andsomemore) olduğu, çünkü verecektir .

Mutlu kodlama.


* ToInteger özel durumları hariç sign(number) * floor(abs(number)) olarak tanımlanır. 5. Baskı ECMAScript belirtiminin 9.4. Bölümüne bakın.

+0

Tamam, bu nedenle bu özellik C'yi (ya da javascript değil başka bir şeyi) anlatıyor, değil mi? Yani kesme javascript ortamının dışında gerçekleşir? –

+0

@ skier88 Teknik olarak DOM uygulaması, çoğu durumda olduğundan şüphelenmeme rağmen, C'nin * olması için * sahip değildir - ancak değeri "uzun" bir integrale sınırlar. JS motorunun [kullanıcıyla erişilemez] bir kısmı vardır, bu da DOM ile "DOM ile" arasındaki dönüşümleri yapan "DOM ile" nasıl konuşulacağını bilir. Gönderilen bağlantı sadece * arayüz * sözleşmelerini kapsamaktadır. 'ToInteger' işlevi ECMAScript'te tanımlanan bir iç işlevdir ve inanıyorum - ama yanılıyor olabilir - bu (veya eşdeğer) integral dönüşümde kullanılır. –

+0

Evet, dilin değişebileceğini biliyorum, sadece hangi seviye kodunun yürütüldüğünü görselleştirmek için bir örnek programlama dili düşünmeme yardımcı oluyor.Yanıt için teşekkürler - muhtemelen uzun bir süre önce teknik özellikleri indirmiş olmalıyım. –

0

ikinci parametre, bir ifade olarak değerlendirilir ve bu sürece bu çalışacak bir dizi döner şekilde olacağını tahmin olacaktır. Kromda çalışıyor gibi görünüyor. Sadece sıfıra bölmediğinden emin ol!

0

Bu işlevler milisaniye bekler. 10ms'den daha büyük bir doğruluk ve tarayıcılar enforce timer restrictions'dan beklediğinizden şüpheliyim.

Firefox ondalık değerleri dikkate almaz. Merak ettiğiniz diğer tüm tarayıcılarda can test.

+0

Cevabınız için teşekkürler. Yukarıdaki gibi, doğru zamanlama ile kayma kadar endişelenmiyorum (algılanabilir olsa da). –

3

Javascript, kayan nokta sayıları ile tamsayılar arasında gerçek bir ayrım yapmaz ve kaputun altında aynı veri türüdür. 1 ve 1.0, bellekte özdeş bit için bittir.

Bu nedenle, evet, herhangi bir gerçek sorun olmadan kesirli bir değer geçirebilirsiniz. Mükemmel geçerli JavaScript. Ve bir tamsayı gerektirse bile, basitçe ve sessizce sizin için yuvarlanmasını daha olasıdır.

Fakat bunun doğru olmasını beklemeyin!0.1, 1 veya 10'un bir zamanı ya da 4.87 numaralı telefonun bir araya gelmesi, muhtemelen geri çağırma çizelgelemesinin düşük tanecikliği nedeniyle aynı zamanda çok yakın bir zamanda ateş edecektir.

+0

Teşekkürler, bazı sebeplerden dolayı veri türleri düşünmüyordum. Ve granulatiry hakkında iyi bir nokta - IIRC, aslında 15ms kadar kötü. Benim endişem sadece uzun süren bir aralığın (muhtemelen algılanamayan) sapması içindir. –

+0

Drift gerçek ve son zamanlarda müzik ritimleri zaman kullanmak için kullanarak bir sorun oldu. Ve berbat. Bu benim çözümümdü: http://alexwayne.tumblr.com/post/13744997785/accurateinterval Veya nesneyi atla ve ham kodumu buraya getir: https://gist.github.com/1d99b3cd81d610ac7351 –

+0

'1.0', JavaScript dilinde aynı Sayı değerini temsil eder. Soru, setTimeout işlevinin davranışı ile ilgilidir. Bu işlevin JavaScript dilinin bir parçası olmadığını unutmayın. HTML standardında belirtilen bir tarayıcı işlevidir. Anlayabildiğim kadarıyla, doğal olmayan bir sayı ikinci argüman olarak ('1.23' gibi) sağlanmışsa, davranış tanımsızdır, yani bunun için bir davranış uygulamak için tarayıcılara kalmış demektir. –

İlgili konular