15 functii prima parte - definire - parametri - returnare valori - stocare referinte

Avem nevoie tot mai mult de functii pentru folosirea metodelor de parcurgere declarative cu functii callback. Asa ca ne ocupam de functii o vreme si ne intoarcem la vectori. Si odata stiind functiile putem sa revenim la operatiile de baza cu elemente in vectori, push, pop, shift, unshift, mai ales ca apar confuzii, care adauga, care sterge, care e in stanga sau in dreapta. Si mai ales shift, unshift, splice si slice sunt confundate intre ele, care dintre modifica(mutates) vectorul sau care face substringuri si care sterge/adauga elemente. Va fi o ocazie sa ne ocupam mai in amanunt de ele odata ce stim cum sa lucram cu functii si sa facem propriile noastre versiune apeland la cativa algoritmi elementari de parcurgere. Functii: metoda de organizare a codului si reutilizare a blocurilor de instructiuni 3 tipuri diferite de declarare, clasic, expresie/anonima, arrow function functiile au parametri folositi pentru datele de intrare functiile pot returna alte valori similar functiilor de la matematica functiile pot vedea variabile externe dar folosirea variabilelor externe creaza o dependenta cu mediul exterior care poate aduce vulnerabilitati similar variabilele globale, care sunt variabile externe definite in domeniul global, creaza aceasi problema de vulnerabilitate daca sunt folosite in functii o functie pura e o functie care returneaza de fiecare data acelasi rezultat pentru aceleasi date de intrare functiile care depind de variabile externe nu sunt pure - se recomanda functiile pure domeniul de vizibilitate local, denumit si scope, e format din totalitatea variabilelor definite in interiorul functiei regula de vizibilitate din interiorul unei functii catre functia parinte in cazul in care exista o relatie de tip functie_parinte - functie_nested, si invers vizibilitatea de la functia parinte catre functia nested functiile ca obiecte sunt de tip referinta, adica o variabila functie contine o referinta(adresa de memorie) la acea functie. consecintele faptului ca o functie e obiect stocat ca referinta 1) functile sunt asa-zise lambda functions, sau "first class citizens", valori cu drepturi depline in aplicatie, a niste valori oarecare 2) ele pot fi folosite ca functii anonime sau atribuite altor variabile 3) o functie poate fi referita de mai multe variabile si va exista in memorie ca functie atat tamp cat va exista o variabila cu o referinta la acea functie ( e de fapt regula generala pentru stocarea unui obiect) https://gist.github.com/profiasiweb/f5cf4f... https://shorturl.at/jLWnk Mai trebuia: 1) faptul ca javascript, respectiv fisierele javascript, indiferent de platforma, browser, nodeJS, sunt interpretate si apoi transformate in cod masina dar partea a doua este amanata pentru o functie pana cand se apeleaza acea functie. Exista astfel 2 faze de executie, una de compilare si generare a domeniilor de vizibilitate si una de executie propriu-zisa, dar nu toate functiile sunt convertite in cod masina in acelasi timp. Astfel pentru optimizare exista lazy compiling si lazy loading lazy compiling(lazy parsing), este un mecanism intern al motoarelor JavaScript care permite amanarea conversiei in cod masina pana la momentul executiei, asta permitand paginii sa se incarce. Altfel daca ar compila tot codul deodata pagina s-ar bloca.Cand o functie este executata la un click de mouse, acea functie e compilata si executata atunci la momentul evenimentului 'click', (Just in Time), care e si numele mecanismului de compilare/executie (JIT). lazy loading - prin impartirea codului in module, incarcarea unui modul e facuta mai tarziu, dupa incarcarea fisierului principal, si asta e un comportament intentionat al engine-ului javascript pentru a nu bloca incarcarea paginii in timp ce toate fisierele/modulele auxiliare s-ar incarca. 2)efectul de hoisting pentru functiile declarate cu function numeFunc. Efect secundar al primei faze din cele doua de executie, faza in care se scaneaza toate functiile si variabilele. Desi toate functiile sunt gasite si li se atribuire un scope si se creaza o legatura la scope-ul parinte prin lant-ul de scope-uri, totusi doar functiile declarate cu function numeFunction(){} sunt incarcate in memorie din prima faza, lucru care permite utilizarea lor oriunde in cod, chiar si la final, pentru ca in faza de executie ele exista deja in memorie inca din prima faza. Unii considera ca poate fi un avantaj prin eliberarea si organizarea codului si trimiterea functiilor la finalul fisierului, altii din contra sustin ca functiile e bine sa ramana inainte de a fi folosite. Cert e ca nu e un efect intentionat ci doar un produs secundar al existentei celor doua faze de executie. 3)Declarare vs Definire, care e termenul corect? Ambele sunt corecte, Declarare e folosit mai multe pentru cazul functiilor clasice cu function numeFunc, in timp ce Definire pentru functii expresie numeFunc = function(){}