Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.75 KB | None | 0 0
  1. /*
  2. Često se pogrešno misli da je JavaScript interpretiran programski jezik koji se interpretira tj.
  3. direktno izvršava red po red bez prethodnog kompajliranja (prevođenja jezika na mašinski jezik).
  4. JavaScript je programski jezik koji se kompajlira pri izvršenju koda (“on the fly“).
  5. JavaScript kod se kompajlira svaki put pri izvršenju koda, tako da kvalitet i brzina odziva JavaScripta
  6. kao jezika najviše zavisi od efikasnosti Javascript engine-a koji vrši kompajliranje.
  7.  
  8. */
  9.  
  10. /*
  11. Deklaracija i definicija promenljive.
  12.  
  13. Deklaracija promenljive je proces stvaranja promenljive, odnosno decinisanje naziva i prostora za promenljivu.
  14. Definicija promenljive je proces dodele vrednosti promenljivoj.
  15.  
  16. */
  17.  
  18.  
  19. /* KAKO SE KOD IZVRŠAVA?
  20.  
  21. JavaScript je uvek hostovan u nekom okruženju. To je najcesce browser, ali može da bude i neki node.js
  22. veb-server.
  23.  
  24. Šta se dešava pri izvršavanju koda?
  25.  
  26. Host (u našem slučaju browser) ima određeni JavaScript Engine.
  27. JavaScript Engine je program koji izvršava JavaScript kod.
  28. Prvi engini su JavaScript Engines bili interpreteri, ali sada su kompajleri.
  29. Postoji mnogo JavaScript Engine-a (mi koristimo v8 koji je Google-ov, pisan u C++ i koristi ga Google Chrome.)
  30.  
  31. Šta se dešava u okviru JS Engine-a?
  32. 1. Parser čita JavaScript code liniju po liniju i proverava sintaksu.
  33. To znači da parser zna da pročita JS code i da proveri da li je on validan.
  34. Ako napravite neke greške Parser odmah prekida program i izlazi error.
  35.  
  36. Ako je sve u redu, onda Parser kreira stukturu podataka poznatiju kao Abstract Syntax Tree.
  37. Zatim se Abstract Syntax Tree prevodi u mašinski kod.
  38. To više nije JS kod, već mašinski kod koji može da bude direktno izvršen od strane procesora računara.
  39.  
  40. Nakon toga kod radi. Različiti engini rade različito ove stvari, ali nećemo ulaziti u tu temaitku.
  41.  
  42. /*
  43.  
  44. /* KAKO JS radi "ispod haube"
  45.  
  46. Svi JS kodovi moraju da rade u nekom okruženju, a ta okruženja se zovu Execution Context.
  47. Execution Context zamislimo kao kutiju, ili kontejner koji prikuplja varijable i gde mi zapravo
  48. vršimo evaluaciju i izvršavanje koda.
  49.  
  50. Default Execution Context je Global Execution Context:
  51. - Za kod koji nije ni u jednoj funkciji
  52. Možemo posmatrati da je GEC povezan sa Global Object-om.
  53. Global objekat je prozor u browseru.
  54.  
  55. lastName === window.lastName (kao da je lastName varijabla tog prozora u GoogleChrome)
  56.  
  57. Šta je sa kodom koji je u funkcijama?
  58.  
  59. PRIMER:
  60.  
  61. var name='John';
  62.  
  63. function first(){
  64. var a = 'Hello!';
  65. second();
  66. var x = a + name;
  67. }
  68.  
  69. function second(){
  70. var b = 'Hi!';
  71. third();
  72. var z = b + name;
  73. }
  74.  
  75. function third(){
  76. var c = 'Hey!';
  77. var z = c + name;
  78. }
  79. first();
  80.  
  81. Svaki put kada pozovemo funkciju, ona dobija svoj novi Execution Context i stavlja se na vrh
  82. Execution Stack-a.
  83. Kada se funkcija izvrsi, sa Execution Stacka uklanjamo njen stek.
  84.  
  85.  
  86. Kako se ovi Execution Contexti kreiraju?
  87.  
  88. - Execution Context Object sadrži 3 propertija:
  89. 1.Variable objct VO - argumente i deklaracije funkcija i deklaracije promenljivih
  90. 2.Scope chain - sadrži trenutni VO
  91. 3.This varijabla
  92.  
  93. Kada je funkcija pozvana, novi Execution Context je stavljen na vrh Execution Stack-a:
  94. Postoje dve faze za kreiranje Execution Contexta:
  95. 1. Faza kreacije
  96. a) Kreiranje VO
  97. b) Kreiranje scope chain-a
  98. c) Postavljanje i setovanje this promenljive
  99.  
  100. 2. Faza izvršavanja
  101. a) Kod funkcije koji je generisao trenutno execution context se izvršava
  102.  
  103. Kreiranje VARIABLE OBJECT
  104. - Kreiran je argument object (svi argumenti koji su kreirani u funkciji)
  105. - Skeniranje koda da pronadjemo deklaracije funkcije. Za svaku finkciju je kreiran property u Variable Objectu
  106. koji pokazuje na tu funkciju.
  107. - Skeniranje koda da pronadjemo promenljive, za svaku varijablu je kreiran property u Variable Objectu
  108. i setovan je na undefined.
  109. POSLEDNJA DVA SE ZOVU HOISTING odnosno deklaracije i definicije funkcija i deklaracije promenljive su dostupne i pre nego što
  110. faza izvršavanja pocne.
  111. Bitna razlika izmedju hoistovanja funkcija i promenljivih je što su funkcije već definisane pre nego sto pocne faza izvrsavanja, a promenljive će biti definisane u fazi izvršavanja.
  112.  
  113. Svaki Execution Context sadrzi objekat koji sadrži važne podatake koji ce se koristiti dok kod radi.
  114.  
  115. /*
  116. /////////////////////////////////////
  117. // Lekcija: Hoisting
  118.  
  119. HOISTING FUNKCIJA
  120. /*
  121. Počećemo s jednostavnom funkcijom koja izračunava godine.
  122. Prvo deklarišemo i definišemo funkciju.
  123.  
  124. function calculateAge(year) {
  125. console.log(2016 - year);
  126. }
  127.  
  128. Pozovemo funkciju:
  129. calculateAge(1965);
  130.  
  131. Zbog hoistinga, mi možemo i da pozvoemo funkciju pre nego što je deklarišemo.
  132.  
  133. calculateAge(1965);
  134. function calculateAge(year) {
  135. console.log(2016 - year);
  136. }
  137.  
  138. Ako uradimo ono radi:
  139. var retirement = function(year) {
  140. console.log(65 - (2016 - year));
  141. }
  142.  
  143. retirement(1999);
  144.  
  145. A ako uradimo ovo, nece raditi jer to nije deklaracija vec definicija funkcije, a hoisting radi samo
  146. sa deklaracijom funkcije i definicijom!
  147.  
  148. retirement(1999);
  149.  
  150. var retirement = function(year) {
  151. console.log(65 - (2016 - year));
  152. }
  153.  
  154.  
  155.  
  156. HOISTING VARIJABLI
  157.  
  158. var age = 23;
  159. console.log(age);
  160.  
  161. Šta se desi ako koristimo varijablu pre nego što je deklarišemo?
  162.  
  163. console.log(age);
  164. var age = 23;
  165.  
  166. Imamo undefined i baš tako hoisting funkcioniše sa varijablama.
  167.  
  168. var age = 23; // Ova varijabla je sačuvana u Global Execution Context Objektu
  169.  
  170. function foo() { // A ova dobija svoj Execution Context
  171. //PRVO BEZ PRVOG console.log
  172. console.log(age);
  173. var age = 65; // Ova i prethodni age nisu iste.
  174. console.log(age);
  175. }
  176. foo();
  177. console.log(age);
  178. */
  179.  
  180.  
  181.  
  182. /////////////////////////////////////
  183. // Lekcija: Scoping
  184.  
  185. /*
  186. Scoping nam govori gde možemo da pristupimo određenoj varijabli.
  187. U JS svaka funkcija kreira scope koji je zapravo prostor u kom su promenljive koje
  188. ta funkcija definiše dostupne.
  189. Leksički scoping - funkcija koja je leksički u okviru neke funkcije, dobija pristup
  190. scope-u funkcije kojoj pripada.
  191.  
  192. OVO SVE PRIPADA GLOBAL SCOPE-u (VO - Value Object)
  193.  
  194. VOglobal
  195. var a = 'Hello!';
  196. first();
  197. OVO JE LOKALNI SCOPE VO1 + VOglobal
  198. function first() {
  199. var b = 'Hi!';
  200. second();
  201.  
  202. function second() { VO2 + VO1 + VOGlobal›
  203. var c = 'Hey!';
  204. console.log(a + b + c);
  205. console.log(a+d);
  206. }
  207. }
  208.  
  209. Globalni Scope nema pristup podscope-ovima. Tako kreiramo SCOPE CHAIN.
  210.  
  211.  
  212. //Koja je razlika izmedju Execution Stacka i Scope Chaina
  213. // Primer za razliku između ES i SC:
  214. var a = 'Hello!';
  215. first();
  216.  
  217. function first() {
  218. var b = 'Hi!';
  219. second();
  220.  
  221. function second() {
  222. var c = 'Hey!';
  223. third()
  224. }
  225. }
  226.  
  227. function third() {
  228. var d = 'John';
  229. //console.log(c);
  230. console.log(a+d);
  231. }
  232. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement