SORU
17 EYLÜL 2010, Cuma


Kaç JavaScript programları web sayfası tarayıcıda bir tek yürütülür?

JavaScript programları açıklamaları ve işlev bildirimleri içerir. JavaScript bir program çalıştırıldığında, bu iki adımdan oluşur:

  1. kod işlevi bildirimleri ve her işlev için taranır. beyan "" (fonksiyon bir nesne oluşturarak) ve bu işlev adlı bir referans bu işlev deyimi içinde çağrılabilir (böylece) yarattı . yürütülür

  2. ifadeleri idam (değerlendirilen) sırayla kodda gözüktüğü gibi)

Çünkü o, buişleri iyi gidiyor:

<script>
    foo();
    function foo() {
        return;
    }
</script>

"İşlev ilan edilmeden önce, işlevi bildirimi deyimi önce değerlendirilir çünkü çalışıyor denir. foo rağmen

Ancak, buçalışmıyor:

<script>
    foo();
</script>
<script>
    function foo() {
        return;
    }
</script>

Bir ReferenceError atılır ("foo tanımlı değil"). Bu yol sonuç Her SCRİPT öğesi içinde HTML kodu web sayfasını temsil eder ayrı bir JavaScript programı ve her zaman HTML ayrıştırıcı karşılaştığı bir SENARYO unsuru, ayraç, program içindeki element (ve daha sonra bir kez program çalıştırılır, çözümleyici hamle için HTML kodu aşağıdaki KOMUT element).

Sonra tekrar, buçalışır:

<script>
    function foo() {
        return;
    }
</script>
<script>
    foo();
</script>

Benim anlayışıma göre burada bu Genel nesne (hizmet olarak Değişken nesne global yürütme içeriği) var (ve kalır) her zaman, ilk JavaScript programı oluşturmak işlevi nesne ve bir başvuru için, ve sonra ikinci bir JavaScript programı kullanan referans için arama fonksiyonu. Bu nedenle, tüm JavaScript programları (içinde tek bir web sayfası) "" aynı Küresel nesne, ve tüm değişiklikleri yapılan Küresel nesne ile bir JavaScript programını olabilir gözlenen tüm JavaScript programları çalıştırmak sonradan.

Şimdi, bu not...

<script>
    // assuming that foo is not defined
    foo();
    alert(1);
</script>

Yukarıdaki durumda, uyarı çağrısıyürütülürçünkü, "() foo" deyimi bir ReferenceError atar tüm JavaScript programı keser ve bu nedenle, tüm sonraki ifadeleri yürütmek.

Ancak, bu durumda...

<script>
    // assuming that foo is not defined
    foo();
</script>
<script>
    alert(1);
</script>

Şimdi, uyarı çağrısıolsun idam ediyor. İlk JavaScript programı bir ReferenceError (ve sonuç olarak tatili) atar, ama ikinci JavaScript program normal olarak çalışır. Tabii ki, tarayıcı hata oluştuğu sonraki JavaScript programları çalıştırmak, değil mi rağmen) bildirir.

Şimdi, ulaştığım sonuçlar şunlardır:

  • web sayfasının HTML kodu içinde KOMUT dosyası, her öğe ayrı bir JavaScript programı temsil eder. Bu programlar HTML çözümleyici onları karşılaştığında hemen idam.
  • aynı içinde JavaScript programları web sayfası "kullanmak" aynı Genel nesne. Bu Genel nesne her zaman (andan itibaren web Sayfası web sayfası yok edilinceye kadar zorlama) var. JavaScript programlarının Genel nesne manipüle edebilir, ve tüm değişiklikleri bir JavaScript programı tarafından Küresel nesnesine yapılan tüm sonraki JavaScript programlarında görülebilir.
  • eğer bir JavaScript sonları (bir hata oluştu alarak) programı, bir sonraki JavaScript programları çalıştırmak için engel değildir.

Aslında bu yazı lütfen ve eğer yanlış bir şey yaparsam söyle.

Ayrıca, bulamadım kaynaklarını açıklamak davranışlar göstermesi halinde, bu yazı ve sanırım bu tarayıcı üreticileri olmalı yayımlanan bu kaynakların bir yerde, eğer öyleyse bu adamlar hakkında ne biliyorsun, lütfen verdiğiniz bağlantılar için onları.

GÜNCELLEME!

TAMAM, (deneyin) kendi soruma burada cevap vereceğim :) Yanıt (e-posta) Dmitry A. Soshnikov (http://www.dmitrysoshnikov.com/ JavaScript ile ilgili bir blog yönetiyor) aldım.

Bu konudaki görüşlerine bakalım: Her KOMUT bloğu genel kod içerir. Her KOMUT bloğu yürütme yürütme yeni bir bağlam oluşturur. Bu nedenle, her KOMUT bloğu kendi yürütme içeriği vardır, ama tüm bu yürütme bağlamlarda aynı Genel nesne paylaşmak.

KOMUT dosyası blokları farklı "alt programlar" aynı paylaşılan devletle. olarak görülebilir

Ayrıca, (3. Baskı) ECMA spec Birleşik Devletleri (Bölüm 10): "Genel kod ECMA bir Program olarak kabul edilir kaynak metin."

CEVAP
17 EYLÜL 2010, Cuma


Fonksiyon kaldırma — süreç değerlendirir function ifadeleri daha önce kalan fonksiyonu — bir parçası olan ECMA standart IIRC (bulamıyorum bir başvuru şu an, ama bildiğim kadarıyla görme tartışmalar EMCAScript bu söz). script etiketler değerlendirilmesi HTML standardının bir parçası. ""O kadar çok kelime, ama senaryo öğeleri belgede göründükleri sırada değerlendirilen yazıyor. ayrı bir program olduğunu belirtmez Bu yüzden daha sonra komut dosyası etiketleri fonksiyonları çekilir değil mi: script henüz değerlendirilmiş değil. Ayrıca bir betik durdurma sonraki komut çalışmaması açıklıyor: geçerli betiğin değerlendirme durduğunda, diğeri başlar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AginoEvolutionHD

    AginoEvoluti

    27 AĞUSTOS 2011
  • Break

    Break

    10 Aralık 2005
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007