2016-12-23 56 views
6

enter image description hereRecusive zamknięcia w JavaScript

function buildList(list) { 
    var i  = 0; 
    var first = function() { 
    console.log("in") 
    console.log(i); 
    } 
    var Second = function() { 
    console.log("out") 
    first(); 
    } 
    return Second; 
} 

var a = buildList([1, 2, 3]) 
console.dir(a); 

a(); // Here closure is created which has function first ,Here first also has one closure of itself that means recursive closure 

kiedy widzę moją konsolę w Chrome ma zamknięcie, które ma pierwszą funkcję, która ma również zamknięcie sama to znaczy ma powtarzający pętlę własnej funkcji w zamknięciu, Does każdy wie, co się tutaj dzieje, jestem bardzo zdezorientowany, Dlaczego istnieje zamknięta pętla infuzji

+4

Czy naprawdę trudno jest poprawnie sformatować i wstawić kod? W każdym razie, opublikuj zrzut ekranu wyświetlacza devtools, który Cię myli. –

+0

Dodałem scrrenschot –

+0

po prostu masz referencje w obu kierunkach, nie ma pętli. :) –

Odpowiedz

0

Narzędzia programistyczne wyświetlają zmienną a, która jest zmienną wskazującą na anonimową funkcję/zamknięcie.

W języku javascript funkcja jest zdefiniowana w zakresie, a także może zdefiniować zakres za pomocą jego bloku bryły. Zakres "zna" wszystkie zmienne wewnątrz bloku definiującego i wszystkie zmienne zdefiniowane poza funkcją, ale w hierarchii zakresów, w których zakres jest zdefiniowany.

Narzędzia pokazują zakres zwracanej funkcji (a w ta sprawa). Funkcja first jest zdefiniowana w zakresie funkcji a.

Zmienna first jest również znana w zakresie anonimowej funkcji przypisanej do zmiennej first.

To, co dostajemy na ekranie: first jest zmienną zawierającą funkcję. W zakresie tej funkcji znana jest zmienna first, która wskazuje na funkcję. W zakresie tej funkcji ...

Widzisz?

+0

Jeśli mówisz, że najpierw ma również swój własny zakres, to dlaczego drugi nie ma własnego zakresu ,,, ??? ma tylko pierwszy i zakres listy? –

+0

Tak, to szwy, że chrome-debugger pokazuje tylko zmienne w zakresie, które są używane w tym zakresie. Zobacz tekst kodu w trzecim wierszu pliku zrzutu ekranu. –

2

A closure to szczególny rodzaj obiektu, który łączy dwie rzeczy: funkcję i środowisko, w którym ta funkcja została utworzona.

  1. Nie trzeba się mylić, zachowanie jest takie samo jak oczekiwano dla tego kodu. Tutaj dzieje się tak, że gdy wykonasz kod console.dir(a); w kodzie, zwróci on funkcję Second, myślę, że jest dla ciebie jasne.

  2. Teraz kiedy będzie poszerzyć tę funkcję pokaże Ci Closure funkcję nadrzędną (environment function) z Second, który jest buildList. W twoim kodzie robi to samo.

  3. Teraz Następną rzeczą jest, aby rozwinąć ten functionbuildList, co pokaże to obiekty potomne nim, które są var i = 0; i function first. Twoja konsola jest wyświetlana zgodnie z oczekiwaniami.

  4. Teraz ponownie po otwarciu first() pokaże Ci Closure funkcję nadrzędną (environment function) z first, który jest buildList. (tak samo było w etapie 2).

Teraz ponownie, a następnie krok 4. i tak onnn powtarza krok 3 ... Może być Ci zrozumieć, co się tutaj dzieje.

+0

Ale nie widzę funkcji kompilacji w moim zamknięciu? –

+0

@Parshuram, Czy wykonujesz ten sam kod, o którym napisałeś? –

+0

Ya sir ale po prostu była zmienna listy ,, zamiast ja, która nie robi żadnej różnicy zobacz mój zrzut ekranu teraz –