2011-07-10 28 views
25

varsayalım Ben: Bu komutSoru() 'ın

<script src="script1.js"></script> 
<script src="script2.js"></script> 

Hem içeride ready() var. Script2.js'in ready()'daki kod her zaman ilkinden sonra yürütür mü?

cevap

29

Evet.

Her şeyden önce, script2.js kodu script1.js'dan sonra, daha sonra belgede (ve defer attribute ayarlanmamıştır) sonra çalıştırılacaktır.

Ayrıca, ready fonksiyon the implementation [source] olup:

ready: function(fn) { 
    // Attach the listeners 
    jQuery.bindReady(); 

    // Add the callback 
    readyList.done(fn); 

    return this; 
}, 

burada readyListseems to be [source] bir deferred object [docs]. Bu, geri çağrıların, o nesneye eklendikleri sırayla yürütüldüğü anlamına gelir.

+1

Aferin Felix. Sadece nasıl açıklanacağını anlamaya çalışan sıkıştırılmamış kodun bir kısmına bakıyordum ... –

+0

Harika cevap için teşekkürler – babonk

2

Birden fazla belge hazır (ları), yanıt vermeleri için işten çıkarılacaktır.

0

.ready() fonksiyonlar ilk tescilli olsun ilk işlenen bazda denir

+0

Bunun için bir kaynak atıfını görmek istiyorum ... anladığım kadarıyla, bunun bir for..in döngüsü ile yapıldığı anlamına gelir; bu, kullanarak siparişi veremeyeceğiniz koleksiyon üzerinde yineleyiciyi kullanır. – jcolebrand

14

jQuery bunun için kendi Deferred nesnesini kullanır. Eğer .ready çağırdığınızda

, fonksiyon readyList eklenir::

readyList.done(fn); 

DOM hazır

, bu fonksiyon çalıştırılır:

jQuery uygun kod sırayla yürütülür kanıtlıyor

:
readyList.resolveWith(document, [ jQuery ]); 

resolveWith fonksiyonu geri aramaları gibi katma fonksiyonlarını yerine bu kodu içeren

Gördüğünüz gibi, geri arama işlevleri shift ed (geri arama dizisinin başlangıcından (yani, readyList)) dışarı atılır, böylece ilk ikincisinden önce gerçekleştirilir.

+0

Güzel açıklama. :) –

+0

Bilgi için teşekkürler, yükseltme – babonk