Neden't setTimeout döngüm iptal değil mi?
Kaç kere konsol içine while
açıklama konsolu Krom () bir milisaniye içinde bir değişken olabilir, ben hızlı bir şekilde bu parçacık doğrudan yazdım JavaScript: merak ettim
var run = true, i = 0;
setTimeout(function(){ run = false; }, 1);
while(run){ i ; }
Sorun sonsuza kadar çalışır.
Neden bu ve nasıl çözebilirim? oluyor
CEVAP
Bu geri JavaScript bir iş parçacıklı doğası için geliyor1. Ne olur hemen hemen bu
- Değişkenleri atanır.
- Sana bir fonksiyonu,
run = false
ayarlamak için zamanlama. Bu çalışma planlanmıştırsonrageçerli işlev (ya da başka bir şeyi şu anda etkin) çalıştırın. - Sonsuz döngü var ve geçerli işlev içinde kalmak.
- Sonsuz döngü sonraasla),
setTimeout()
geri yürütülür verun=false
.
Gördüğünüz gibi, setTimeout()
bir yaklaşım burada alışkanlık iş. while
bu durumda zaman kontrol ederek geçici bir çözüm olabilir, ama bu gerçek ölçüm kurcalamak olacak.
1En azından daha pratik amaçlar için tek iş parçacıklı olarak görebilirsiniz. Aslında bir çok adı var "olay döngü". Bu döngü tüm fonksiyonları idam edilene kadar sıraya alın. Eğer yeni bir fonksiyon sıra, bu sıra içinde, ilgili pozisyonda konur.Sonramevcut görevini tamamladı, motoru sıradan bir sonraki fonksiyon (örneğin, setTimeout()
tarafından sunulan bir zamanlama bakımından ve yürütür. alır
Zamanın bir fonksiyonu olarak her noktada bir sonucu olarak yürütülür, böylece yürütme hemen hemen tek dişli yapma. Link aşağıda açıklanan etkinlikler için bazı istisnalar vardır.
Başvuru için:
http://stackoverflow.com/a/16757582/1169798
Burada benzer bir senaryo daha ayrıntılı olarak anlatıldı
http://stackoverflow.com/a/2734311/1169798
Ayrıntılı açıklama JS ve zaman. tek dişli olarak görülebilir zaman bir daha
Neden't GCC*****a (**)*(**) optim...
Neden' ◎ܫ◎ ve fonksiyonu t JavaSc...
Neden boyutu(x ) x artım değil mi?...
Neden setTimeout, 0 fn () bazen faydal...
Neden Java statik olarak bir sınıf bil...