Cum circuitul în javascript - overflow stivă în limba rusă

După cum Albert Einstein a spus:

Dacă nu se poate explica ceva la o perioadă de șase ani, este puțin probabil să te înțelegi pe deplin.

Am încercat să explice circuitul meu prieten de 27 de ani, iar el nu a înțeles.

Cum se explica vina pentru oricine care este familiarizat cu toate principiile de programare necesare pentru înțelegerea de închidere (funcții, variabile, domeniul de aplicare, etc.), dar, de fapt, închiderile?

Această întrebare este tradus din CO vorbitor de limba engleză.

Acest cod dă întotdeauna 16, pentru că funcția de interior vede de x. care este variabilă în exterior funkutsii. În acest caz, argumentul funcției. Doar în interiorul () se pot diferenția între tmp din exterior ().

Aceasta este închiderea sau închiderea. Mai precis, închiderea se numește o funcție externă, și totul în ea se numește un mediu de închidere sau aproape de miercuri.

Se spune uneori că închiderea este o funcție care returnează o funcție, este greșit să numim închidere este suficient pentru funcțiile interne, se referă la variabila în afara domeniului său de aplicare.

Funcția de mai sus va emite, de asemenea, 16, deoarece chiar și după ce bara de foo continuă să aibă acces la x si tmp. chiar dacă variabila în sine și bara nu este în domeniul de aplicare în care acestea sunt declarate.

În acest caz, deoarece tmp variabilă este încă în interiorul barei de închidere. ea continuă să crească cu fiecare bara de apel.

Aici este un exemplu simplu de un circuit:

Puteți crea mai mult de un circuit într-un singur mediu, întorcându-le o matrice, obiect, sau legat de variabile globale. În acest caz, ele vor funcționa cu aceeași valoare a lui x sau tmp. fără a crea copii separate.

Deoarece în exemplul nostru, x este un număr, valoarea este copiată în foo argumentul x lui.

După cum v-ați aștepta, fiecare apel la bara (10) crește x.memb. Ceea ce s-ar putea să nu așteptați, deci este ca x continuă să se refere la același obiect ca și această vârstă. După două apeluri la bar. age.memb va fi de 2! Apropo, și pierderi de memorie apar în obiectele HTML.

Răspuns 9 '15 aprilie, la 08:45

„Capacitatea de a aminti contextul funcției“ - în cazul în care funcția este numit document.body, putem spune că funcția amintit document.body? - Stiva 23 ianuarie '16 la 14:20

document.body - aceasta nu este o variabilă, și proprietăți obiect la care ne referim, prin intermediul unui document de variabilă globală. Ceea ce am scris, nu se aplică în cazul proprietăților, și se aplică numai variabila în sine. Poate că putem spune că am câștigat un document variabilă la nivel mondial, ci pentru că este la nivel mondial, nu este nevoie să profite de ea - deci este accesibil de oriunde (cu excepția locurilor unde se va bloca vizibilitatea variabilei locale cu același nume - și în acest caz, trebuie să-l, și nu ar fi în măsură să se întoarcă, luând în circuit). Așa că l-am zamknom sau nu - diferența nu este, în practică, nu, nu am nici verifica. - Vyacheslav Lapin 26 ianuarie '16 la 16:33

Dacă pe scurt și răspicat, că ceva de genul asta.

Răspuns 7 '15 aprilie, la 10:04

a explicat cu un exemplu.

Răspuns 7 '15 aprilie, la 10:02