Programy JavaScript składają się z instrukcji i deklaracji funkcji. Po uruchomieniu programu JavaScript następujące dwa kroki:Ile programów JavaScript jest uruchamianych dla pojedynczej strony internetowej w przeglądarce?
kod jest skanowany pod kątem deklaracji funkcji i każdego func. deklaracja jest "wykonywana" (przez utworzenie obiektu funkcji) i tworzone jest nazwane odniesienie do tej funkcji (aby funkcja ta mogła być wywoływana z poziomu instrukcji)
instrukcje są wykonywane (oceniane) sekwencyjnie (tak jak pojawiają się w kodzie)
z tego powodu, to działa dobrze:
<script>
foo();
function foo() {
return;
}
</script>
Chociaż funkcja „foo” nazywa zanim zostanie ogłoszony, to działa, bo zabawy Deklaracja ction jest oceniana przed oświadczeniem.
Jednak ta nie działa:
<script>
foo();
</script>
<script>
function foo() {
return;
}
</script>
ReferenceError zostanie wyrzucony ("foo nie jest zdefiniowana"). Prowadzi to do wniosku, że każdy element SCRIPT w kodzie HTML strony reprezentuje odrębny program JavaScript i za każdym razem, gdy analizator składni HTML napotka element SCRIPT, wykonuje program wewnątrz tego elementu (a następnie po uruchomieniu programu , parser przechodzi do kodu HTML następującego po elemencie SCRIPT).
Potem znowu, to działa:
<script>
function foo() {
return;
}
</script>
<script>
foo();
</script>
moim rozumieniu jest to, że istnieje globalnego obiektu (który służy jako zmienna obiektu w kontekście globalnym wykonania) (i pozostaje) w każdym czasie, więc pierwszy program JavaScript utworzy obiekt funkcji i sporządzi dla niego odniesienie, a następnie drugi program JavaScript użyje tego odnośnika do wywołania funkcji. Dlatego wszystkie programy JavaScript (w obrębie jednej strony internetowej) "wykorzystują" ten sam obiekt globalny, a wszystkie zmiany dokonane w obiekcie globalnym przez jeden program JavaScript mogą być obserwowane przez wszystkie uruchomione później programy JavaScript.
Teraz należy pamiętać, to ...
<script>
// assuming that foo is not defined
foo();
alert(1);
</script>
W powyższym przypadku nadejścia połączenia nie wykona, ponieważ "foo()" oświadczenie rzuca ReferenceError (który rozkłada cały program JavaScript) i dlatego wszystkie kolejne instrukcje nie są wykonywane.
Jednak w tym przypadku ...
<script>
// assuming that foo is not defined
foo();
</script>
<script>
alert(1);
</script>
Teraz nadejścia połączenia nie zostanie wykonany. Pierwszy program JavaScript rzuca odwołanie ReferenceError (aw konsekwencji przerwy), ale drugi program JavaScript działa normalnie. Oczywiście przeglądarka zgłosi błąd (chociaż wykonał kolejne programy JavaScript po wystąpieniu błędu).
Teraz, moje wnioski są następujące:
- każdy element SCRIPT w kodzie HTML strony internetowej stanowi odrębny program JavaScript. Programy te są wykonywane natychmiast, gdy analizator składni HTML je napotka.
- Wszystkie programy JavaScript na tej samej stronie internetowej "używają" tego samego obiektu globalnego. Ten obiekt globalny istnieje przez cały czas (od momentu pobrania strony internetowej do zniszczenia strony internetowej). Programy JavaScript mogą manipulować obiektem globalnym, a wszystkie zmiany dokonane w obiekcie globalnym za pomocą jednego programu JavaScript mogą być obserwowane we wszystkich kolejnych programach JavaScript.
- jeśli jeden program JavaScript zepsuje się (przez zgłoszenie błędu), to nie przeszkadza w uruchomieniu kolejnych programów JavaScript.
Proszę sprawdzić fakturę i powiedzieć, czy coś jest nie tak.
Ponadto, nie znalazłem zasobów, które wyjaśniają zachowania wspomniane w tym poście, i zakładam, że twórcy przeglądarek musieli gdzieś opublikować takie zasoby, więc jeśli wiesz o nich, podaj linki do nich.
AKTUALIZACJA!
OK, idę do (spróbować) odpowiedzieć na moje własne pytanie tutaj :) Dostałem odpowiedź (poprzez e-mail) z Dmitry A. Soshnikov (prowadzi bloga o JavaScript w http://www.dmitrysoshnikov.com/).
Jego zdanie na ten temat brzmi następująco: każdy blok SCRIPT zawiera kod globalny. Wykonywanie każdego bloku SCRIPT tworzy nowy kontekst wykonania. Dlatego każdy blok SCRIPT ma swój własny kontekst wykonania, ale wszystkie te konteksty wykonania współużytkują ten sam obiekt globalny.
Bloki SCRIPT mogą być wyświetlane jako różne "podprogramy" o tym samym udostępnionym stanie.
Co więcej, specyfikacja ECMAScript (wydanie trzecie) stwierdza (rozdział 10): "Kod globalny to tekst źródłowy traktowany jako program ECMAScript."
Opis połączenia WYKAZ. http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting – Rajat