2014-11-30 12 views
6

Dla każdej funkcji w kodzie JavaScript tworzony jest nowy kontekst wykonania.Konteksty wykonawcze w JavaScript

Ile kontekstów wykonawczych jest w pamięci po uruchomieniu następującego kodu? Zauważ, że funkcja Bar nie jest wywoływana.

function Foo() { 

    function Bar() {} 

} 

Foo(); 

Ponadto, kiedy są tworzone konteksty wykonawcze? W czasie ewaluacji lub w czasie wykonywania?

+0

Jakie są wasze ** ** odpowiedzi (lub nawet domysły)? To wygląda na pytanie quizowe. – Pointy

+0

To pytanie jest prosto z mojego mózgu. Czy to wygląda na pytanie z quizu? – Ben

+0

Cóż, bez większego kontekstu, czyta się to jak coś, co byłoby na zadanie domowe, ale sprawiedliwe; jeśli powiesz, że tak nie jest, to nie jest. :) – Pointy

Odpowiedz

4

Wywołanie funkcji wywołania w czasie wykonywania powoduje powstanie kontekstu wykonania. W twoim przykładzie istnieje tylko jedno wywołanie funkcji, więc tylko jeden kontekst wykonania jest zaangażowany.

Układ statyczny (kompilacja) rozmieszczenia funkcji jest ważny, ponieważ określa zakres i ewentualną zawartość kontekstów wykonawczych. Jest to faktyczne wezwanie do funkcji, która ma znaczenie dla stworzenia kontekstu. (Niektóre starsze języki używały terminu "rekord aktywacji", ale mogło to być bardziej przeznaczone do alokacji na stosie).

Możesz przeczytać szczegóły w czasami tłustym języku the spec, choć może to być trudne do zauważenia las dla drzew. Spec jest napisany pod względem przekazywanej kontroli. Wywołanie funkcji jest bardzo powszechnym sposobem, w jaki to się dzieje, ale tak samo jest wywołaniem procedury obsługi zdarzenia lub wywołaniem kompletnego bloku <script>, gdy jest on początkowo ładowany przez przeglądarkę.

+2

Wierzę, że istnieje również globalny kontekst wykonania. Jeden, który jest wprowadzany podczas oceny pliku javascript. Poza tym musi istnieć jakiś kontekst wykonawczy, w ramach którego można ocenić definicję Foo. – Jazzepi

+0

@Jazzepi tak, to prawda; osobiście uważam to za zasadniczo specjalny przypadek; to * jak * wywołanie funkcji na wiele ważnych sposobów, ale nie jest to dokładnie to samo. – Pointy

4

Po utworzeniu funkcji są one kompilowane w czasie wykonywania. Funkcja jest wywoływana, gdy je wywołujesz.

Pozwól mi wyjaśnić trochę:

Możesz mieć dowolną liczbę funkcji i kontekstów każdej funkcji rozmowę tworzy nowy kontekst.

//Global Context 
var helloWorld = "hello world!"; 
function foo(){//execution context 
    function bar(){//execution context 
    console.log('bar'); 
    } 
} 
foo(); 

Więc w foo powyżej funkcji kod jest nazywany, i tworzy nowy kontekst dla funkcji foo i kontekstu wykonania na pasku jest stworzony tylko po to nazwać, ale to jest skompilowany już w czasie wykonywania.

Po pierwszym załadowaniu skryptu przez przeglądarkę domyślnie wprowadza globalny kontekst wykonania. Jeśli wywołujesz funkcję w zasięgu globalnym, sekwencyjny przepływ twojego programu wchodzi do wywoływanej funkcji, tworząc nowy kontekst wykonania i przesuwając ten kontekst na szczyt stosu wykonawczego.

Teraz mają szczegółów na temat kontekstu wykonanie:

Tak, za każdym razem wywoływana jest funkcja, nowy kontekst wykonanie jest tworzony. Każde wywołanie kontekście realizacji ma 2 etapy: etap

1. utworzenia:

Po wywołaniu funkcji, ale zanim to wykonuje dowolny kod wewnątrz są: tworzenie łańcucha zakres, tworzenie zmiennych, funkcji i argumentów i określ wartość "tego".

2. stopień aktywacji:

przypisać wartości odniesienia do funkcji i wykonuje kod.


Now, let's have a bit more knowledge of execution context:

function foo (a, b, c) { 
    function z(){alert(‘Z!’);} 
    var d = 3; 
} 
foo(‘foo’,’bar’); 

ExecutionContext w foo() połączenia: Etap 1: argumenty powstaje

ExecutionContext: { 
    arguments: { 
     0: ‘foo’, 1: ‘bar’, 
     length: 2, callee: function() //Points to foo function 
    } 
} 

Etap 3a: zmiennej instancji, argumenty

ExecutionContext: { 
    arguments: { 
     0: ‘foo’, 1: ‘bar’, 
     length: 2, callee: function() //Points to foo function 
    }, 
    a: ‘foo’, b: ‘bar’, c: undefined 
} 

Etap 3b: zmienna instancji, funkcje

ExecutionContext: { 
    arguments: { 
     0: ‘foo’, 1: ‘bar’, 
     length: 2, callee: function() //Points to foo function 
    }, 
    a: ‘foo’, b: ‘bar’, c: undefined, 
    z: function() //Created z() function 
} 

Etap 3c: Zmienna instancji zmienne

ExecutionContext: { 
    arguments: { 
     0: ‘foo’, 1: ‘bar’, 
     length: 2, callee: function() //Points to foo function 
    }, 
    a: ‘foo’, b: ‘bar’, c: undefined, 
    z: function(), //Created z() function, 
    d: undefined 
} 

Etap 4: Ustawiono wartość

ExecutionContext: { 
    arguments: { 
     0: ‘foo’, 1: ‘bar’, 
     length: 2, callee: function() //Points to foo function 
    }, 
    a: ‘foo’, b: ‘bar’, c: undefined, 
    z: function(), //Created z() function, 
    d: undefined, 
    this: window 
} 

Po utworzeniu ExecutionContext funkcja rozpoczyna uruchamia swój kod z pierwszej linii, dopóki nie znajdzie zwrotu lub funkcja się zakończy. Za każdym razem, gdy ten kod próbuje uzyskać dostęp do zmiennej, jest on odczytywany z obiektu ExecutionContext.

+0

OK, więc poniższe utworzą dwa konteksty wykonania: 'function Foo() {this.bar = (function() {}())}; nowy Foo(); '. Czy 'delete'ing właściwość' bar' usuwa odpowiedni kontekst wykonania? – Ben

+0

tworzenie funkcji nie powoduje, że "pozostaje w stosie". –

+0

@JasonS To jest mój błąd podczas pisania i poprawiania teraz. –

3

Na nazywając Foo();

  • Pojedynczy kontekst wykonanie jest tworzony ze względu na pw jednym function
  • wskaźnik do funkcji Bar jest również tworzone w tym procesie.

Ponadto, jest to domyślne envionment gdzie Twój kod jest wykonywany po raz pierwszy, zwany Kontekst globalny

1

Mój najlepszy przypuszczenie, że może to zależeć od środowiska są uruchomione kod.

Chociaż nie jest to trudne do sprawdzenia, V8 nie tworzy kontekstu wykonawczego dla funkcji, która nie jest w ogóle wykonywana.

Executed function Non-executed function

Powiązane problemy