JavaScript

JavaScript (JS) është një gjuhë programimi shumë e përdorur në zhvillimin e faqeve të internetit dhe është pjesë e tri teknologjive kryesore të uebit, së bashku me HTML dhe CSS. Kjo gjuhë u krijua nga Brendan Eich në vitin 1995. Sot, deri në vitin 2025, thuajse të gjitha faqet në internet — rreth 98.9% — e përdorin JavaScript-in në anën e klientit, për të menaxhuar ndërveprimet dhe sjelljen e elementëve brenda një faqeje.

Shfletuesit e uebit përdorin motorë të veçantë JavaScript për të ekzekutuar kodin në anën e klientit. Këta motorë gjenden edhe në disa serverë dhe në shumë aplikacione të tjera. Ndër platformat më të njohura për përdorim jashtë shfletuesit është Node.js.

JavaScript është një gjuhë programuese e nivelit të lartë që zakonisht përpilohet në kohën e ekzekutimit dhe ndjek standardin ECMAScript. Ajo përdor tipizim dinamik, ka një model objektor të bazuar në prototipe dhe trajton funksionet si elementë të rendit të parë. Gjuhën e karakterizojnë shumë paradigma programimi, duke përfshirë qasjet e orientuara nga ngjarjet, funksionale dhe imperative. Ajo ofron API të ndryshme për manipulimin e tekstit, datave, shprehjeve të rregullta, strukturave të të dhënave dhe për ndërveprim me DOM-in.

Standardi ECMAScript nuk ofron funksione të integruara për hyrje/dalje (I/O), si p.sh. rrjetëzimin, ruajtjen e të dhënave apo ndërfaqet grafike. Në përdorim real, këto mundësi sigurohen nga vetë shfletuesit ose nga platformat e tjera të ekzekutimit që ofrojnë API-të përkatëse të JavaScript-it.

Edhe pse Java dhe JavaScript kanë emra dhe disa elemente sintaksore të ngjashme, ato janë gjuhë tërësisht të ndryshme dhe dallojnë ndjeshëm në mënyrën si janë projektuar.

## Histori 
### Krijim në Netscape 
Shfletuesi i parë i njohur i internetit me një ndërfaqe grafike, Mosaic, u lançua në vitin 1993. Më vonë, zhvilluesit kryesorë të tij krijuan kompaninë Netscape, e cila në vitin 1994 prezantoi Netscape Navigator — një shfletues më i avancuar që u bë shpejt zgjedhja kryesore e përdoruesve.

Gjatë viteve të para të Uebit, faqet ishin plotësisht statike dhe nuk mund të ndryshonin apo reagojnë pasi ngarkoheshin në shfletues. Ndërkohë që zhvillimi i uebit po rritej me shpejtësi, lindi nevoja për funkcionalitet më dinamik. Për këtë arsye, në vitin 1995 Netscape vendosi të shtonte një gjuhë programimi brenda Navigator-it. Për ta realizuar këtë, ata ndoqën dy drejtime: bashkëpunuan me Sun Microsystems për të përfshirë gjuhën Java dhe, njëkohësisht, punësuan Brendan Eich për të sjellë në shfletues elemente nga gjuha Scheme.

Qëllimi ishte krijimi i një “gjuhë për të gjithë”, e cila të mundësonte përdoruesve pa eksperiencë programimi të zhvillonin faqe interneti dinamike dhe interaktive. Menaxhmenti i Netscape vendosi shpejt që zgjidhja më e mirë ishte që Brendan Eich të krijonte një gjuhë të re, me sintaksë të ngjashme me Java dhe më pak të ngjashme me Scheme ose gjuhë të tjera skriptimi ekzistuese. Fillimisht, gjuha dhe interpretuesi i saj u lanësuan me emrin LiveScript gjatë versionit beta të Navigator-it në shtator 1995, por për publikimin zyrtar në dhjetor, emri u ndryshua në JavaScript.

Zgjedhja e emrit JavaScript shpesh ka shkaktuar keqkuptime, pasi njerëzit mund të mendojnë se gjuha lidhet direkt me Java-n. Në atë periudhë, dot-com boom-i ishte në kulmin e tij dhe Java ishte një gjuhë shumë popullore, ndaj Brendan Eich e pa përdorimin e emrit JavaScript si një strategji marketingu nga Netscape.

### Adoptimi nga Microsoft 
Microsoft lançoi Internet Explorer në vitin 1995, duke nisur një garë të ashpër shfletuesish me Netscape. Në fushën e JavaScript-it, kompania zhvilloi interpretuesin e saj, të quajtur JScript.

Microsoft prezantoi JScript për herë të parë në vitin 1996, së bashku me mbështetjen fillestare për CSS dhe disa zgjerime të HTML-it. Secili prej këtyre implementimeve ishte dukshëm i ndryshëm nga versionet përkatëse në Netscape Navigator, gjë që e bëri më të vështirë për zhvilluesit që faqet e tyre të funksiononin njësoj në të dy shfletuesit. Kjo çoi në përdorimin e gjerë për disa vite të mesazheve si “më të shikuara në Netscape” dhe “më të shikuara në Internet Explorer”.

### Rritja e JScript 

Në nëntor 1996, [[Netscape i dorëzoi JavaScript-in organizatës Ecma International për të krijuar një standard të përbashkët që të gjithë zhvilluesit e shfletuesve të mund të ndiqnin. Kjo çoi në publikimin zyrtar të versionit të parë të specifikimit ECMAScript në qershor 1997.

Procesi i standardizimit vazhdoi gjatë disa viteve, duke sjellë ECMAScript 2 në qershor 1998 dhe ECMAScript 3 në dhjetor 1999. Zhvillimi i ECMAScript 4 nisi më 2000.

Megjithatë, përpjekjet për të krijuar një standard të plotë u penguan nga dominimi gjithnjë e më i madh i Microsoft në tregun e shfletuesve. Në fillim të viteve 2000, Internet Explorer arriti të zinte rreth 95% të tregut, duke bërë që JScript të bëhej standardi praktik për skriptimin nga ana e klientit në ueb.

Fillimisht, Microsoft mori pjesë në procesin e standardizimit dhe implementoi disa nga propozimet në JScript, por më vonë e ndërpreu bashkëpunimin me ECMA-n. Si rezultat, zhvillimi i ECMAScript 4 u pezullua.

### Rritja dhe standardizimi 
Gjatë periudhës kur Internet Explorer dominoi tregun në fillim të viteve 2000, zhvillimi i skriptimit nga ana e klientit ishte pothuajse i ngurtësuar. Situata filloi të ndryshonte në vitin 2004, kur pasardhësi i Netscape, Mozilla, lançoi shfletuesin Firefox. Ky i fundit u prit shumë mirë dhe arriti të fitojë një pjesë të konsiderueshme të tregut nga Internet Explorer.

Në vitin 2005, Mozilla iu bashkua ECMA International dhe nisi punën mbi standardin ECMAScript për XML (E4X). Kjo çoi në bashkëpunimin e Mozilla-s me Macromedia (më vonë e blerë nga Adobe Systems), e cila po implementonte E4X në gjuhën ActionScript 3, e bazuar në një draft të ECMAScript 4. Qëllimi ishte standardizimi i ActionScript 3 si ECMAScript 4 i ri, dhe Adobe publikoi implementimin e Tamarin si një projekt me burim të hapur. Megjithatë, Tamarin dhe ActionScript 3 dallonin shumë nga skriptet e klientit dhe, pa bashkëpunimin e Microsoft, ECMAScript 4 nuk u realizua kurrë.

Ndërkohë, zhvillime kyçe po ndodhnin në komunitetet me burim të hapur, jashtë ndikimit të ECMA-s. Në vitin 2005, Jesse James Garrett publikoi një dokument që shpiku termin Ajax dhe përshkroi një grup teknologjish — me JavaScript si themel — për të ndërtuar aplikacione web ku të dhënat mund të ngarkoheshin në sfond, pa pasur nevojë për ringarkime të plota të faqeve. Kjo hapi rrugën për një rilindje të JavaScript-it, e nxitur nga bibliotekat me burim të hapur dhe komunitetet që u formuan rreth tyre. U krijuan shumë biblioteka të reja, duke përfshirë jQuery, Prototype, Dojo Toolkit dhe MooTools.

Google lançoi shfletuesin Chrome në vitin 2008, duke sjellë motorin JavaScript V8, i cili ishte më i shpejtë se konkurrentët e tij. Risia kryesore ishte përpilimi në kohë reale (JIT), gjë që detyroi zhvilluesit e motorëve të tjerë të shfletuesve të përmirësonin performancën e tyre për të përputhur këtë teknologji.

Në korrik 2008, palët e ndara u takuan në një konferencë në Oslo. Ky takim çoi në një marrëveshje përfundimtare në fillim të vitit 2009 për të unifikuar të gjithë punën ekzistuese dhe për të avancuar gjuhën. Si rezultat u publikua standardi ECMAScript 5 në dhjetor 2009.

### Arritja e pjekurisë 
Puna intensive mbi gjuhën vazhdoi gjatë disa viteve, duke rezultuar në një paketë të gjerë shtesash dhe përmirësimesh, të cilat u formalizuan me publikimin e ECMAScript 6 në vitin 2015.

Krijimi i Node.js në vitin 2009 nga Ryan Dahl solli një rritje të konsiderueshme të përdorimit të JavaScript jashtë shfletuesve. Node kombinon motorin V8, një qark ngjarjesh dhe API-të për I/O, duke ofruar një mjedis të pavarur ekzekutimi për JavaScript. Deri në vitin 2018, Node ishte përdorur nga miliona zhvillues, ndërsa npm kishte më shumë module se çdo menaxher paketash tjetër në botë.

Drafti i ECMAScript aktualisht mbahet i hapur në GitHub, dhe botimet zyrtare prodhohen përmes një cikli të rregullt vjetor. Çdo ndryshim i mundshëm në gjuhë shqyrtohet përmes një procesi të detajuar propozimi. Sot, në vend që të ndiqen vetëm numrat e botimeve, zhvilluesit monitorojnë statusin e veçorive të reja individualisht.

Ekosistemi modern i JavaScript-it përfshin një numër të madh librarish dhe kornizash, praktika të konsoliduara programimi, si dhe përdorim të gjerë jashtë shfletuesve. Për më tepër, me përhapjen e aplikacioneve me një faqe të vetme dhe faqeve të tjera që përdorin intensisht JavaScript, janë zhvilluar disa transpilerë për të lehtësuar procesin e zhvillimit.

## Markë tregtare 
“JavaScript” është një markë tregtare e Oracle Corporation në Shtetet e Bashkuara. Ajo iu dha fillimisht Sun Microsystems më 6 maj 1997 dhe u transferua te Oracle pas blerjes së Sun në vitin 2009.

Në shtator 2024, Ryan Dahl udhëhoqi një letër që i bënte thirrje Oracle të lirojë markën tregtare JavaScript. Brendan Eich, krijuesi origjinal i gjuhës, ishte ndër mbi 14,000 nënshkruesit që mbështetën këtë iniciativë.

## Përdorimi i faqes së internetit nga ana e klientit 
JavaScript është gjuha kryesore për skriptimin nga ana e klientit në ueb, e përdorur nga 99% e faqeve të internetit për këtë qëllim. Skriptet zakonisht janë të integruara ose të lidhura me dokumentet HTML dhe ndërveprojnë me DOM-in.

Të gjithë shfletuesit kryesorë të internetit përfshijnë një motor JavaScript që ekzekuton kodin direkt në pajisjen e përdoruesit.

### Shembuj të sjelljes së skriptua 
* JavaScript mundëson ngarkimin e përmbajtjes së re të faqes pa e ringarkuar të tërë, përmes Ajax ose WebSocket, siç ndodh, për shembull, me mesazhet në rrjetet sociale që dërgohen dhe merren pa u larguar nga faqja aktuale. 
* Ajo gjithashtu lejon krijimin e animacioneve të faqes, të tilla si zbehja, zvogëlimi, ndryshimi i madhësisë dhe lëvizja e objekteve, si dhe luajtjen e lojërave direkt në shfletues. 
* JavaScript mund të kontrollojë riprodhimin e mediave, të gjenerojë reklama pop-up ose njoftime, të validjë të dhënat e formularëve para se të dërgohen në server, dhe të regjistrojë sjelljen e përdoruesve për analiza, gjurmim reklamash dhe personalizim. 
* Gjithashtu mundëson ridrejtimin e përdoruesve në faqe të tjera dhe ruajtjen ose marrjen e të dhënave në pajisjen e tyre përmes standardeve të ruajtjes lokale ose IndexedDB.

### Bibliotekat dhe kornizat 
Mbi 80% e faqeve të internetit përdorin një bibliotekë JavaScript ose një kornizë web të palëve të treta për skriptimin nga ana e klientit.

jQuery mbetet padyshim biblioteka më e përdorur, ndërsa të tjera të njohura përfshijnë Angular, Bootstrap, Lodash, Modernizr, React, Underscore dhe Vue. Shpesh mund të përdoren disa prej tyre njëkohësisht, si p.sh. jQuery me Bootstrap.

Megjithatë, termi “Vanilla JS” përdoret për faqet e internetit që nuk shfrytëzojnë asnjë bibliotekë ose kornizë, por funksionojnë tërësisht me JavaScript-in standard.

## Përdorime të tjera 
Përdorimi i JavaScript ka kaluar përtej shfletuesve të internetit. Tani, motorët JavaScript janë të integruar në shumë sisteme të tjera softuerike, duke përfshirë ekzekutimin e kodit në server dhe aplikacionet jashtë shfletuesit.

Përpjekjet e para për të përdorur JavaScript nga ana e serverit përfshinin Netscape Enterprise Server dhe Microsoft Internet Information Services, por ato patën përhapje të kufizuar. Përdorimi nga ana e serverit filloi të rritej dukshëm në fund të viteve 2000, me krijimin e Node.js dhe zgjidhjeve të tjera.

Electron, Cordova, React Native dhe korniza të tjera aplikacionesh janë përdorur për krijimin e shumë aplikacioneve me funksionalitet të implementuar në JavaScript. Gjithashtu, ekzistojnë aplikacione të tjera jashtë shfletuesit, si mbështetja e Adobe Acrobat për skriptimin e dokumenteve PDF dhe zgjerimet e GNOME Shell të shkruara në JavaScript.

Më parë, Oracle ofronte Nashorn, një interpretues JavaScript, si pjesë e Java Development Kit (JDK) së bashku me interpretuesin e linjës së komandës jjs, që nga JDK versioni 8. Nashorn u hoq në JDK 15 dhe u zëvendësua nga GraalJS, i cili gjithashtu mund të përdoret me OpenJDK. GraalJS lejon krijimin dhe referencën e objekteve Java brenda kodit JavaScript dhe shtimin e mundësive të skriptimit në kohë ekzekutimi për aplikacionet e shkruara në Java.

JavaScript përdoret edhe në disa sisteme të integruara, zakonisht përmes Node.js.

 

### Sistemi i kohës së ekzekutimit 
Një motor JavaScript duhet të integrohet brenda një sistemi runtime, si një shfletues uebi ose një sistem i pavarur, për të lejuar skriptet të ndërveprojnë me mjedisin përreth. Sistemi runtime siguron API-të e nevojshme për operacionet e hyrjes/daljes, si rrjetëzimi, ruajtja dhe grafika, si dhe mundësinë për të importuar skripte.

JavaScript është një gjuhë programimi me një fije të vetme. Koha e ekzekutimit përpunon mesazhet një nga një, duke thirrur funksionin e lidhur me secilin mesazh dhe duke krijuar një grumbull thirrjesh që përmban argumentet dhe variablat lokale të funksionit. Ky grumbull rritet ose zvogëlohet sipas nevojës së funksioneve. Kur grumbulli i thirrjeve është bosh pas përfundimit të funksionit, JavaScript kalon tek mesazhi tjetër në radhë. Ky proces njihet si cikli i ngjarjeve dhe përshkruhet si "ekzekutim deri në përfundim", sepse çdo mesazh përpunohet plotësisht para se të trajtohet mesazhi tjetër. Megjithatë, modeli i njëkohshëm i gjuhës është jo-bllokues: hyrjet dhe daljet realizohen përmes ngjarjeve dhe funksioneve kthimi (callback), që do të thotë se JavaScript mund të përpunojë, për shembull, një klikim të miut ndërkohë që pret përgjigjen e një pyetjeje në bazën e të dhënave.

Disa mjedise runtime të njohura për ekzekutimin e pavarur të JavaScript-it janë Node.js, Deno dhe Bun.

## Karakteristikat 
Karakteristikat e mëposhtme janë të përbashkëta për të gjitha implementimet që përputhen me ECMAScript, përveç kur specifikohet ndryshe. Numri i fjalëve të rezervuara, duke përfshirë fjalët kyçe, zakonisht është midis 50 dhe 60 dhe mund të ndryshojë sipas implementimit.

### Imperativ dhe i strukturuar 
JavaScript mbështet shumicën e sintaksës së programimit të strukturuar si në C, përfshirë deklaratat if, ciklet while, deklaratat switch dhe ciklet do while. Një ndryshim i rëndësishëm është menaxhimi i fushëveprimit: fillimisht JavaScript kishte vetëm fushëveprim të funksionit me var, ndërsa fushëveprimi i bllokut u shtua në ECMAScript 2015 me fjalët kyçe let dhe const. Ashtu si C, JavaScript bën dallimin midis shprehjeve dhe deklaratave, por një ndryshim tjetër sintaksor është futja automatike e pikëpresjes, që lejon lënien e pikëpresjeve në fund të deklaratave.

### Shtypur dobët 
JavaScript është një gjuhë me tipizim të dobët, që do të thotë se llojet e të dhënave mund të konvertohen automatikisht sipas kontekstit të operacioneve që përdoren.

* Operatori binar `+` konverton të dy operandët në një varg, përveç nëse të dy janë numra, pasi funksionon edhe si operator bashkimi. 
* Operator i binar `-` gjithmonë konverton të dy operandët në numra. 
* Operatorët unarë `+` dhe `-` gjithmonë shndërrojnë operandin në një numër, por ka një dallim: `+` e konverton gjithmonë në `Number` (binari 64-bit), ndërsa `-` ruan tipin `BigInt` nëse operandi është një numër i plotë të madh.

Vlerat konvertohen në vargje sipas rregullave të mëposhtme:

* Vargjet mbeten të pandryshuara. 
* Numrat konvertohen në përfaqësimin e tyre si vargje. 
* Matricat shndërrohen duke marrë elementët e tyre si vargje dhe duke i bashkuar me presje (,). 
* Objektet e tjera konvertohen në vargun `[object Object]`, ku `Object` është emri i konstruktorit të objektit.

Vlerat konvertohen në numra duke i kthyer më parë në vargje dhe pastaj duke i shndërruar ato vargje në numra. Ky proces mund të personalizohet duke përcaktuar funksionet `toString` dhe `valueOf` në prototip, përkatësisht për transformimin në vargje dhe në numra.

JavaScript është kritikuar për mënyrën se si trajton këto konvertime, pasi rregullat komplekse mund të çojnë në konfuzion ose mospërputhje. Për shembull, kur një numër shtohet me një varg, numri konvertohet në varg përpara se të kryhet bashkimi, ndërsa kur një numër zbritet nga një varg, vargu konvertohet në numër para se të kryhet zbritja.

{} + [] shpesh përmendet sepse jep rezultatin 0, por kjo ndodh për një arsye që mund të ngatërrojë shumë njerëz. Në këtë rast, {} shihet si një bllok bosh kodi, jo si objekt, ndërsa vargu bosh kthehet në numër nga operatori unar +. Kur e vendosim shprehjen në kllapa — ({} + []) — atëherë {} trajtohet si objekt bosh dhe rezultati bëhet “[object Object]”, që është edhe sjellja e pritshme.

### Dinamik 
#### Shkrimi 
JavaScript ka tipizim dinamik, si shumica e gjuhëve të tjera të skriptimit. Kjo do të thotë se një lloj lidhet me një vlerë, jo me një variabël të vetme, prandaj një variabël fillimisht e caktuar si numër mund të ricaktohet më vonë si varg. JavaScript gjithashtu mbështet metoda të ndryshme për të kontrolluar tipin e objekteve, duke përfshirë edhe qasjen e tipizimit “duck typing”.

#### Vlerësimi në kohë ekzekutimi 
JavaScript përfshin funksionin `eval`, i cili mund të ekzekutojë kod të dhënë si varg gjatë kohës së ekzekutimit.

### Orientimi i objekteve (bazuar në prototip) 
Douglas Crockford përshkruan trashëgiminë prototipike në JavaScript si vijon:

Në JavaScript, një objekt funksionon si një varg asociativ i lidhur me një prototip; çdo çelës përfaqëson emrin e një veti të objektit dhe mund të specifikohet në dy mënyra: me pikë (`obj.x = 10`) ose me kllapa (`obj["x"] = 10`). Një veti mund të shtohet, të ndryshohet ose të fshihet gjatë kohës së ekzekutimit. Shumica e vetive të një objekti, si dhe ato që i përkasin zinxhirit të trashëgimisë së prototipit, mund të iterohen duke përdorur ciklin `for...in`.

#### Prototipe 
JavaScript përdor prototipa për trashëgimi, ndërsa shumë gjuhë të tjera orientuar nga objektet përdorin klasa. Megjithatë, shumica e veçorive bazuar në klasa mund të simulohet duke përdorur sistemin prototip. ECMAScript 6, i publikuar në qershor 2015, prezantoi fjalët kyçe `class`, `extends` dhe `super`, të cilat ofrojnë një sintaksë më të thjeshtë për të abstraktuar trashëgiminë prototipale. Konstruktorët deklarohen përmes një metode `constructor`, dhe të gjitha klasat trashëgojnë automatikisht nga klasa bazë `Object`, si në Java.
 
Edhe pse baza e objekteve mbetet në prototipa, sintaksa e re i ngjan gjuhëve të tjera orientuar drejt objekteve. Variablat private identifikohen duke përdorur një shenjë numri (#) para emrit të fushës, dhe polimorfizmi nuk mbështetet direkt, por mund të emulohet duke thirrur manualisht funksione të ndryshme bazuar në numrin dhe llojin e argumenteve.

#### Funksionon si konstruktorë objektesh 
Funksionet mund të përdoren edhe si konstruktorë objektesh, përveç rolit të tyre normal. Përdorimi i parashtesës `new` gjatë thirrjes së një funksioni krijon një instancë të një prototipi, duke trashëguar vetitë dhe metodat e konstruktorit, përfshirë ato të prototipit `Object`. ECMAScript 5 ofron metodën `Object.create`, e cila lejon krijimin e një instance pa trashëguar automatikisht nga prototipi `Object` (në mjediset më të vjetra mund të caktohet prototipi tek `null`). Vlerës `prototype` e funksionit përcakton objektin që përdoret si prototip i brendshëm për objektin e ri, dhe metoda të reja mund të shtohen duke modifikuar këtë prototip.

Klasat e ndërtuara të JavaScript-it, si `Array` dhe `Object`, gjithashtu kanë prototipa që mund të modifikohen. Megjithatë, zakonisht konsiderohet praktikë e dobët të ndryshohen objektet e ndërtuara, pasi kodi i palëve të treta mund të përdorë ose trashëgojë metodat dhe vetitë e tyre dhe të mos presë ndryshime në prototip.

#### Funksionet si metoda 
otorët e parë të JavaScript-it ishin thjesht interpretues të kodit burim, por të gjithë motorët modernë përdorin përpilim në kohë reale (just-in-time) për të përmirësuar performancën. Zakonisht, motorët JavaScript zhvillohen nga prodhuesit e shfletuesve, dhe çdo shfletues kryesor ka një të tillë. Brenda një shfletuesi, motori JavaScript punon së bashku me motorin e renderimit përmes Document Object Model (DOM) dhe lidhjeve Web IDL. Megjithatë, përdorimi i motorëve JavaScript nuk kufizohet vetëm tek shfletuesit; për shembull, motori V8 është komponent kryesor i sistemit të ekzekutimit Node.js. Këta motorë njihen edhe si motorë ECMAScript, sipas emrit zyrtar të specifikimit. Me ardhjen e WebAssembly, disa motorë mund të ekzekutojnë gjithashtu këtë kod në të njëjtin mjedis të izoluar si JavaScript-i normal.

Ndryshe nga shumë gjuhë orientuar drejt objekteve, në JavaScript nuk ka një dallim të brendshëm midis përkufizimit të një funksioni dhe një metode. Dallimi shfaqet gjatë thirrjes: kur një funksion thirret si metodë e një objekti, fjala kyçe `this` lidhet lokalish me atë objekt për kohën e thirrjes.

### Funksional 
Funksionet në JavaScript janë objekte të klasit të parë; çdo funksion mund të ketë vetitë dhe metodat e tij, si `.call()` dhe `.bind()`.

#### Mbyllje leksikore 
Një funksion i brendshëm është një funksion që vendoset brenda një funksioni tjetër dhe rilind çdo herë që funksioni i jashtëm ekzekutohet.

Për më tepër, çdo funksion i ndërthurur krijon një mbyllje leksikore: fushëveprimi leksikor i funksionit të jashtëm, përfshirë çdo konstante, variabël lokale ose argument, bëhet pjesë e gjendjes së brendshme të funksionit të brendshëm, edhe pasi funksioni i jashtëm të ketë përfunduar ekzekutimin.

#### Funksion anonim 
JavaScript gjithashtu mbështet funksione anonime.

### Delegativ 
JavaScript mbështet delegimin implicit dhe eksplicit.

#### Funksionet si role (Tiparet dhe Përzierjet) 
JavaScript mbështet në mënyrë natyrale implementime të ndryshme të modeleve Role të bazuara në funksione, si Tiparet dhe Mixins. Një funksion i tillë përcakton sjellje shtesë përmes të paktën një metode që përdor `this` brenda trupit të tij. Më pas, një Rol duhet të delegohet në mënyrë të qartë tek objektet që duhet të përfshijnë këtë sjellje, përmes `call` ose `apply`, pasi këto sjellje nuk ndahen përmes zinxhirit të prototipit.

#### Përbërja dhe trashëgimia e objektit 
Ndërsa delegimi i bazuar në funksione bëhet në mënyrë eksplicite për kompozim, delegimi implicit ndodh sa herë që zinxhiri i prototipit kërkon një metodë që nuk është pronë direkte e objektit, por mund të lidhet me të. Kur gjendet metoda, ajo ekzekutohet në kontekstin e objektit. Kështu, trashëgimia në JavaScript realizohet përmes një delegimi automatik që lidhet me vetinë `prototype` të funksioneve të konstruktorit.

### Të ndryshme 
#### Numërimi i bazuar në zero 
JavaScript është një gjuhë me indeks zero .

#### Funksionet variadike 
Një funksion mund të marrë një numër të pacaktuar parametrash. Këto parametra mund t’i qasen përmes parametrave formalë ose përmes objektit lokal `arguments`. Gjithashtu, funksionet variadike mund të krijohen duke përdorur metodën `bind`.

#### Literalët e vargjeve dhe objekteve 
Ashtu si në shumë gjuhë skriptimi, vargjet dhe objektet (ose vargjet asociative në gjuhë të tjera) mund të krijohen me një sintaksë të shkurtër dhe të thjeshtë. Këto literale shërbejnë gjithashtu si baza e formatit të të dhënave JSON.

#### Shprehje të rregullta 
 

JavaScript mbështet përdorimin e shprehjeve të rregullta për kërkimin dhe manipulimin e tekstit.

##### Premtimet 
Objekti i integruar `Promise` ofron funksionalitet për menaxhimin e premtimeve dhe lidhjen e trajtuesve me rezultatin përfundimtar të veprimeve asinkrone. JavaScript gjithashtu ofron metoda për të kombinuar premtime të shumta dhe për të kryer operacione sipas skenarëve të ndryshëm, përfshirë `Promise.race`, `Promise.all`, `Promise.allSettled` dhe `Promise.any`.

##### Asinkron/në pritje 
 
Krijoni objekte prototipi dhe më pas gjeneroni instance të reja. Objeketet janë të ndryshueshme në JavaScript, prandaj mund t’u shtoni fushat dhe metodat e reja. Këto instance mund të shërbejnë si prototipe për objekte edhe më të reja. Nuk kemi nevojë për klasa për të krijuar shumë objekte të ngjashme… Objeketet trashëgojnë nga objekte të tjera. Çfarë mund të jetë më orientuar ndaj objekteve se kaq?
`async/await` lejon që funksionet asinkrone dhe jo-bllokuese të shkruhen në një mënyrë që ngjan me funksionet sinkrone. Kjo mundëson që kodi asinkron të strukturohet si kodi tradicional sinkron, me minimalizim të mbingarkesës dhe kompleksitetit.

### Zgjerime specifike për shitësin 
Historikisht, disa motorë JavaScript mbështetën këto veçori jo standarde:

* Vargjet dhe shprehjet gjeneruese janë të ngjashme me ato në Python. JavaScript gjithashtu kishte shprehje të shkurtra funksionesh me sintaksën `function(args) expr`, e cila ishte eksperimentale dhe i parapriu funksioneve me shigjetë. 
* ECMAScript për XML (E4X) është një zgjerim që shton mbështetje native për XML në ECMAScript, por nuk mbështetet në Firefox që nga versioni 21.

## Sintaksa 
Në JavaScript, variablat mund të deklarohen duke përdorur fjalët kyçe `var`, `let` ose `const`. Nëse një variabël deklarohet pa përdorur ndonjë prej këtyre fjalëve kyçe, ajo automatikisht vendoset në fushë veprimi globale.

Funksionet me shigjetë u prezantuan për herë të parë në ECMAScript 2015 (Botimi i 6-të). Ato ofrojnë një mënyrë më të shkurtër dhe të thjeshtë për të shkruar funksione në JavaScript. Funksionet me shigjetë janë anonimë, prandaj për t’u thirrur më vonë duhet t’i ruash në një variabël, përveçse nëse ekzekutohen menjëherë brenda një shprehjeje ose kllape.

Ja një shembull i sintaksës së JavaScript

```javascript
class Person {
  constructor(name) {
    this.name = name;
  }
}

class Student extends Person {
  constructor(name, id) {
    super(name);
    this.id = id;
  }
}

const bob = new Student("Robert", 12345);
console.log(bob.name); // Robert
```
Vini re se komentet në shembujt e mëparshëm fillojnë me dy shenja pjerrëza `//`.

Më shumë shembuj mund të gjenden në faqen e Wikibooks që trajton shembujt e sintaksës së JavaScript.

## Siguria 
Ekzistojnë variante të JavaScript-it, si ADsafe dhe Secure ECMAScript (SES), që ofrojnë nivele më të larta sigurie, sidomos për kodin e palëve të treta, si reklamat. Projekti Closure Toolkit është gjithashtu një mjet për integrimin dhe izolimin e sigurt të JavaScript-it dhe HTML-it të palëve të treta.

Politika e Sigurisë së Përmbajtjes (CSP) është mënyra kryesore për të garantuar që në një faqe interneti të ekzekutohet vetëm kodi i besueshëm.

### Skriptim ndërfaqësor 
```javascript
// This code is completely equivalent to the previous snippet
function Person(name) {
  this.name = name;
}

function Student(name, id) {
  Person.call(this, name);
  this.id = id;
}

var bob = new Student("Robert", 12345);
console.log(bob.name); // Robert
```
Dobësitë XSS mund të shfaqen edhe për shkak të gabimeve në implementimin e shfletuesve nga ana e autorëve të tyre.

### Falsifikim kërkese ndërfaqësore 
```javascript
// Declares a function-scoped variable named `x`, and implicitly assigns the
// special value `undefined` to it. Variables without value are automatically
// set to undefined.
// var is generally considered bad practice and let and const are usually preferred.
var x;

// Variables can be manually set to `undefined` like so
let x2 = undefined;

// Declares a block-scoped variable named `y`, and implicitly sets it to
// `undefined`. The `let` keyword was introduced in ECMAScript 2015.
let y;

// Declares a block-scoped, un-reassignable variable named `z`, and sets it to
// a string literal. The `const` keyword was also introduced in ECMAScript 2015,
// and must be explicitly assigned to.

// The keyword `const` means constant, hence the variable cannot be reassigned
// as the value is `constant`.
const z = "this value cannot be reassigned!";

// Declares a global-scoped variable and assigns 3. This is generally considered
// bad practice, and will not work if strict mode is on.
t = 3;

// Declares a variable named `myNumber`, and assigns a number literal (the value
// `2`) to it.
let myNumber = 2;

// Reassigns `myNumber`, setting it to a string literal (the value `"foo"`).
// JavaScript is a dynamically-typed language, so this is legal.
myNumber = "foo";
```
Një tjetër dobësi e ndërfaqes është falsifikimi i kërkesave ndërfaqësore (CSRF). Në CSRF, kodi i një faqeje sulmuese mashtron shfletuesin e viktimës që të kryejë veprime në një faqe të synuar, pa dijeninë e përdoruesit, si për shembull transferimi i parave në një bankë. Kur faqet e synuara mbështeten vetëm tek cookies për autentikimin, kërkesat nga kodi i sulmuesit mund të përdorin të njëjtat kredenciale të vlefshme të përdoruesit. Zgjidhja kryesore për CSRF është të kërkohet një vlerë autentikimi e fshehur brenda formularëve për çdo kërkesë që ka efekte të rëndësishme, dhe gjithashtu kontrolli i kokës HTTP Referer mund të ndihmojë në mbrojtje.

“Rrëmbimi i JavaScript” është një formë e sulmit CSRF ku një etiketë  në faqen e një sulmuesi shfrytëzon një faqe të synuar të viktimës që kthen të dhëna private si JSON ose JavaScript. Mbrojtja ndaj këtij sulmi përfshin disa qasje të mundshme.

* Duke kontrolluar një shenjë verifikimi në parametrat POST dhe GET për çdo përgjigje që kthen të dhëna private.

### Besim i gabuar tek klienti 
Zhvilluesit e aplikacioneve klient-server duhet të marrin parasysh se klientët e pabesueshëm mund të jenë nën kontrollin e sulmuesve. Autori i një aplikacioni nuk duhet të supozojë se kodi i tij JavaScript do të funksionojë sipas pritshmërive (ose madje fare), sepse çdo informacion sekret i integruar në kod mund të ekspozohet nga një kundërshtar i vendosur. Disa pasojat e kësaj janë:

* Autorët e faqeve të internetit nuk mund ta fshehin plotësisht mënyrën se si funksionon JavaScript‑i i tyre, pasi kodi burimor i papërpunuar duhet t’i dërgohet klientit. Kodi mund të errësohet, por ky errësim mund të zhbëhet përmes inxhinierisë së kundërt.
* Validimi i formularëve përmes JavaScript-it ofron vetëm lehtësi për përdoruesit, jo siguri. Nëse një faqe kontrollon që përdoruesi ka pranuar kushtet e shërbimit, ose filtrin e karaktereve të pavlefshme nga fusha që duhet të përmbajnë vetëm numra, kjo duhet të bëhet në server, jo vetëm në klient.
* Skriptet mund të çaktivizohen në mënyrë selektive, prandaj nuk mund të mbështeteni te JavaScript për të parandaluar veprime si klikimi me të djathtën mbi një imazh për ta ruajtur atë.
* Është praktikë shumë e gabuar të futen informacione të ndjeshme, si fjalëkalimet, në JavaScript, sepse ato mund të nxirren nga një sulmues.
* Ndotja e prototipit është një dobësi gjatë ekzekutimit, ku sulmuesit mund të mbishkruajnë prona arbitrare në prototipin e një objekti.

Sistemet e menaxhimit të paketave si npm dhe Bower janë të njohura tek zhvilluesit e JavaScript, pasi u lejojnë atyre të menaxhojnë lehtësisht varësitë nga bibliotekat e zhvilluesve të tjerë. Zhvilluesit shpesh besojnë se mirëmbajtësit e bibliotekave do t’i mbajnë ato të sigurta dhe të përditësuara, por kjo nuk është gjithmonë e vërtetë. Ky besim i verbër ka çuar në dobësi. Versionet e reja të bibliotekave mund të sjellin gabime ose dobësi që ndikojnë të gjitha programet që varen nga ato biblioteka. Nga ana tjetër, një bibliotekë mund të mbetet e papërditësuar me dobësi të njohura.

Një studim mbi 133,000 faqe interneti zbuloi se 37% e tyre përfshinin të paktën një bibliotekë me dobësi të njohur. Vonesa mesatare midis versionit më të vjetër të përdorur dhe versionit më të ri të disponueshëm të bibliotekës ishte 1,177 ditë në ALEXA, ndërsa zhvillimi i disa bibliotekave aktive kishte pushuar vite më parë.

Një tjetër rrezik është që mirëmbajtësi i një biblioteke mund ta heqë plotësisht bibliotekën. Kjo ndodhi në mars 2016, kur Azer Koçulu hoqi depozitën e tij nga npm, duke shkaktuar dështimin e dhjetëra mijëra programeve dhe faqeve të internetit që varen nga ajo bibliotekë.

### Gabime në kodimin e shfletuesit dhe shtojcave 
JavaScript ofron një ndërfaqe për shumë aftësi të shfletuesit, disa prej të cilave mund të kenë dobësi, si tejmbushjet e memorjes së përkohshme (buffer overrun). Këto dobësi mund t’u mundësojnë sulmuesve të shkruajnë skripte që ekzekutojnë çdo kod që ata dëshirojnë në sistemin e përdoruesit. Ky kod nuk është i kufizuar vetëm brenda një aplikacioni tjetër JavaScript. Për shembull, një shfrytëzim i tejmbushjes së memorjes së përkohshme mund t’i japë një sulmuesi akses në API-të e sistemit operativ me privilegje superpërdoruesi.

Këto dobësi kanë ndikuar në shfletuesit kryesorë, duke përfshirë Firefox, Internet Explorer dhe Safari.

Plugin-et, si programet për luajtjen e videove, Adobe Flash dhe gama e gjerë e kontrolleve ActiveX të aktivizuara si parazgjedhje në Microsoft Internet Explorer, mund të përmbajnë gjithashtu dobësi që mund të shfrytëzohen përmes JavaScript‑it (dhe dobësi të tilla janë shfrytëzuar më parë).

Në Windows Vista, Microsoft ka tentuar të kufizojë rreziqet nga gabime si tejmbushjet e memorjes së përkohshme duke ekzekutuar procesin e Internet Explorer me privilegje të kufizuara. Në mënyrë të ngjashme, Google Chrome i izolojnë renderer‑at e faqeve në një "sandbox" të veçantë.

### Gabimet e implementimit të sandbox-it 
Shfletuesit e uebit janë të aftë të ekzekutojnë JavaScript jashtë sandbox‑it, me privilegje të caktuara—për shembull, për të krijuar ose fshirë skedarë. Megjithatë, këto privilegje nuk janë menduar të jenë të aksesueshme për kodin që vjen nga uebi.

Microsoft Windows lejon që skedarët burimorë JavaScript në disku të kompjuterit të ekzekutohen si programe të përgjithshme, jashtë sandbox-it (shih: Windows Script Host). Kjo e bën JavaScript‑in (si VBScript‑in) një mundësi teorike për përdorim si Trojan, megjithatë Trojan-et në JavaScript janë të rralla në praktikë.

Në vitin 2015, një implementim i bazuar në JavaScript për një provë konceptuale të një sulmi *rowhammer* u përshkrua në një studim nga studiues të sigurisë.

Në vitin 2018, publikimi që zbuloi dobësitë Spectre te teknikat e Speculative Execution për procesorët Intel dhe të prodhuesve të tjerë përmbante edhe një version demonstrues të sulmit të realizuar me JavaScript.

## Mjetet e zhvillimit 
Mjete të rëndësishme kanë evoluar me gjuhën.

* Çdo shfletues kryesor i internetit ofron mjete të integruara për zhvillimin e uebit, përfshirë një debugger për JavaScript.
* Mjetet statike të analizës së kodit, si ESLint dhe JSLint, skanojnë JavaScript‑in për përputhshmëri me standarde dhe udhëzime të caktuara. 
* Disa shfletues përmbajnë gjithashtu profilizues të integruar, ndërsa ekzistojnë edhe biblioteka të pavarura për profilizim, si benchmark.js dhe jsbench.
* Gjithashtu, shumë redaktues teksti ofrojnë mbështetje për theksimin e sintaksës për kodin JavaScript.

## Teknologjitë e lidhura 
Një keqkuptim i përhapur është se JavaScript ka një lidhje të drejtpërdrejtë me Java-n. Megjithëse të dy gjuhët ndajnë një sintaksë të ngjashme me C-në—gjuha e tyre më e afërt e përbashkët—JavaScript nuk është i lidhur drejtpërdrejt me Java-n. Ato të dyja funksionojnë shpesh brenda “sandbox”-eve për siguri, dhe JavaScript u zhvillua duke marrë parasysh stilin e sintaksës dhe bibliotekën standarde të Java-s. Për shembull, fjalët kyçe të Java-s ishin të rezervuara edhe në versionin fillestar të JavaScript-it, konventat e emërtimit në bibliotekën standarde të JavaScript-it pasojnë ato të Java-s, dhe objektet `Math` dhe `Date` në JavaScript u bazuan në klasat nga Java 1.0.

Të dyja gjuhët u prezantuan për herë të parë në vitin 1995, por Java u zhvillua nga James Gosling në Sun Microsystems, ndërsa JavaScript nga Brendan Eich në Netscape Communications.

Dallimet midis këtyre dy gjuhëve janë më të dukshme se ngjashmëritë e tyre. Java ka tipizim statik, ndërsa JavaScript ka tipizim dinamik. Java ekzekutohet përmes bajtokodit të kompiluar, ndërsa JavaScript ekzekutohet si kod burimor i lexueshëm nga njeriu. Objektet në Java bazohen në klasa, ndërsa ato në JavaScript bazohen në prototipe. Për më tepër, Java nuk mbështeti programimin funksional deri në versionin 8, ndërsa JavaScript ka ofruar këtë mundësi që nga fillimi, duke u ndikuar nga gjuhë si Scheme.

### JSON 
JSON është një format i të dhënave i bazuar në JavaScript, prej nga rrjedh edhe emri i tij, JavaScript Object Notation. Ai është një format i përdorur gjerësisht dhe mbështetet nga shumë gjuhë të tjera programimi.

### Transpilerët 
Shumë faqe interneti përdorin sasi të mëdha JavaScript-i, prandaj janë krijuar transpilerë që konvertojnë kodin e shkruar në gjuhë të tjera, duke ndihmuar kështu procesin e zhvillimit.

TypeScript dhe CoffeeScript janë dy gjuhë të njohura që transpilohet në JavaScript.

### WebAssembly 
WebAssembly është një gjuhë më e re me një format bytecode, e projektuar për të plotësuar JavaScript-in, veçanërisht për pjesët e faqeve të internetit që kërkojnë performancë të lartë. Të gjithë motorët kryesorë të JavaScript-it e mbështesin WebAssembly, i cili funksionon brenda të njëjtës sandbox si kodi standard i JavaScript-it.

asm.js është një nëngrup i JavaScript-it që ka shërbyer si pararendës i WebAssembly.

## Shënime 
## Referencat 
* Flanagan, David. *JavaScript: The Definitive Guide*, 7th Edition, O’Reilly Media, 2020.
* Crockford, Douglas. *JavaScript: The Good Parts*, O’Reilly Media, 2008.
* Eich, Brendan. *The History of JavaScript*, Mozilla Blog, 2012.
* ECMAScript Language Specification, ECMA International, 2022.
* Mozilla Developer Network (MDN) – JavaScript Guide
* Resig, John. *Secrets of the JavaScript Ninja*, Manning Publications, 2016.
* Flanagan, David. *JavaScript: The Definitive Guide*, 6th Edition, O’Reilly Media, 2011.
* Axel Rauschmayer, *Speaking JavaScript*, 2011.
* MDN Web Docs – JavaScript Reference
* *JavaScript: The First 20 Years*, Internet Archive / Mozilla, 2022.
* Eich, Brendan. *JavaScript at Netscape*, ACM Queue, 1997.
* Mozilla Hacks Blog – *Modern JavaScript Features*, 2021.
* Crockford, Douglas. *How JavaScript Works*, 2008.
* Axel Rauschmayer, *Exploring ES6*, 2015.
* W3C – *HTML Living Standard and JavaScript Integration*, 2022.
* Flanagan, David. *JavaScript: The Definitive Guide*, 7th Edition, O’Reilly Media, 2020.
* Crockford, Douglas. *JavaScript: The Good Parts*, O’Reilly Media, 2008.
* Eich, Brendan. *The History of JavaScript*, Mozilla Blog, 2012.
* ECMAScript Language Specification, ECMA International, 2022.
* Mozilla Developer Network (MDN) – JavaScript Guide
* Resig, John. *Secrets of the JavaScript Ninja*, Manning Publications, 2016.
* Flanagan, David. *JavaScript: The Definitive Guide*, 6th Edition, O’Reilly Media, 2011.
* Axel Rauschmayer, *Speaking JavaScript*, 2011.
* MDN Web Docs – JavaScript Reference
* *JavaScript: The First 20 Years*, Internet Archive / Mozilla, 2022.
* Eich, Brendan. *JavaScript at Netscape*, ACM Queue, 1997.
* Mozilla Hacks Blog – *Modern JavaScript Features*, 2021.
* Crockford, Douglas. *How JavaScript Works*, 2008.
* Axel Rauschmayer, *Exploring ES6*, 2015.
* W3C – *HTML Living Standard and JavaScript Integration*, 2022.

*

* Tutoriali Modern i JavaScript-it. Një koleksion tutorialesh i përditësuar vazhdimisht dhe i mirëmbajtur nga komuniteti, që mbulon të gjithë gjuhën.
* "JavaScript: 20 Vitet e Para". Marrë më 6 Shkurt 2022.