Javascript setTimeoutve setInterval( diğer ) olmak üzere iki (en çok kullanılan) tür zamanlayıcı işlevi vardır
Her iki yöntemin de imzası vardır. Parametre olarak geri arama işlevi ve gecikme süresi alırlar.
setTimeoutgecikmeden sonra yalnızca bir kez setIntervalyürütülürken, her gecikme milisaniyesinden sonra geri arama işlevini çağırmaya devam eder.
her iki yöntem de zamanlayıcının süresi dolmadan bunları temizlemek için kullanılabilecek bir tamsayı tanımlayıcısı döndürür.
clearTimeoutve clearIntervalher iki yöntem de yukarıdaki işlevlerden döndürülen bir tamsayı tanımlayıcısı alır setTimeoutvesetInterval
Misal:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
Yukarıdaki kodu çalıştırırsanız uyarıldığını göreceksiniz before setTimeoutve after setTimeoutson olarak I am setTimeout1sn (1000ms)
Örnekten fark edebileceğiniz şey setTimeout(...), eşzamansız olmasıdır, yani bir sonraki ifadeye geçmeden önce zamanlayıcının geçmesini beklemediği anlamına gelir.alert("after setTimeout");
Misal:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
Yukarıdaki kodu çalıştırırsanız, uyarı verdiğini görürsünüz before setIntervalve after setIntervalsonunda I am setInterval 1 saniye (1000 ms) sonra 5 kez uyarı verir.I am setInterval .
Tarayıcı nasıl dahili olarak yapar?
Kısaca açıklayacağım.
Javascript'te olay kuyruğu hakkında bilmek zorunda olduğunu anlamak için. Tarayıcıda uygulanan bir olay kuyruğu var. Bir olay js'de tetiklendiğinde, tüm bu olaylar (tıklama vb. Gibi) bu kuyruğa eklenir. Tarayıcınızda yürütülecek hiçbir şey yoksa, bir olayı kuyruktan alır ve tek tek yürütür.
Şimdi, setTimeoutveyasetInterval geri tarayıcıdaki bir zamanlayıcıya kaydedilir ve verilen süre sona erdikten sonra olay kuyruğuna eklenir ve sonunda javascript olayı kuyruktan alır ve yürütür.
Javascript motoru tek iş parçacıklı olduğundan ve her seferinde yalnızca bir şey yürütebildiğinden böyle olur. Böylece, başka bir javascript çalıştıramaz ve zamanlayıcıyı takip edemezler. Bu yüzden bu zamanlayıcılar tarayıcıya kaydedilir (tarayıcı tek iş parçacıklı değildir) ve zamanlayıcıyı izleyebilir ve zamanlayıcı sona erdikten sonra sıraya bir olay ekleyebilir.
Aynı için olur setIntervalo Temizlenen veya tarayıcı sayfası yenilenir kadar olay belirtilen aradan sonra tekrar kuyruğa eklenir bu durumda sadece.
Not
Bu işlevlere ilettiğiniz gecikme parametresi, geri aramayı gerçekleştirmek için gereken minimum gecikme süresidir. Bunun nedeni, zamanlayıcının süresi dolduktan sonra tarayıcının olayı javascript motoru tarafından yürütülecek kuyruğa eklemesi, ancak geri aramanın yürütülmesinin kuyruktaki olay konumunuza bağlı olması ve motorun tek iş parçacıklı olması nedeniyle tüm olayları yürütmesidir. sıra teker teker.
Bu nedenle, geri aramanız bazen diğer kodunuz iş parçacığını engellediğinde ve kuyrukta ne olduğunu işlemek için zaman vermiyorsa, belirli bir gecikme süresinden daha fazla zaman alabilir.
Ve bahsettiğim gibi javascript tek bir ipliktir. Yani, uzun süre ipliği bloke ederseniz.
Bu kodu beğenin
while(true) { //infinite loop
}
Kullanıcınız sayfanın yanıt vermediğini belirten bir mesaj alabilir .
setTimeout(function(){/*YourCode*/},1000);