JavaScript: Fusha e ndryshueshme. Shtrirja e ndryshueshme Js ndryshore globale në funksion

Përshëndetje! Sot do të flasim për fushën e ndryshoreve (lexoni se çfarë është një ndryshore). Fakti është se kur krijoni një ndryshore në një funksion dhe emri i tij përkon me emrin e një ndryshoreje jashtë funksionit, atëherë mund të ketë situata të ndryshme interesante që lidhen me qëllimet globale dhe lokale të ndryshores.

Withshtë me këtë që ne do ta kuptojmë këtë mësim.

Variabla globale

Të gjitha variablat që krijoni jashtë funksionit janë globale. Dhe është e domosdoshme të krijoni një ndryshore duke përdorur fjalën kyçe var, nëse kjo nuk është bërë, atëherë ndryshorja do të jetë e dukshme kudo në program, dhe për më tepër, me modalitetin e rreptë të aktivizuar, kjo do të shkaktojë një gabim. Në mënyrë që të mundësoni modalitetin e rreptë, mjafton të shkruani rreshtin "përdorni rreptë" në fillim të skenarit tuaj. Kjo do t'i tregojë përkthyesit JavaScript që t'i përmbahet standardit JavaScript. Këtu është një shembull duke përdorur një ndryshore globale

Var a \u003d 6; // funksioni i ndryshores globale double () (alarmi i kthimit (a * a); // duke përdorur një ndryshore globale) double ();

Shembulli deklaron një ndryshore globale a, së cilës i është caktuar vlera 6. Në funksion, ne mund t'i qasemi kësaj ndryshore dhe madje edhe më shumë, të ndryshojmë vlerën e saj dhe kjo vlerë do të ndryshojë kudo.

Le të shohim një shembull ku vlera e një ndryshoreje globale ndryshohet në një funksion, dhe pastaj ne i qasemi ndryshores globale jashtë funksionit dhe shohim vlerën që i ishte vendosur në vetë funksionin.

Var a \u003d 6; funksioni double () (a \u003d 5; // ndryshoni vlerën e ndryshores globale në alarmin e kthimit të funksionit (a * a);) double (a); // thirrni dokumentin e funksionit. shkruani (a); // vlera e ndryshores globale

Siç mund ta shihni nga shembulli, nëse ndryshoni vlerën e një ndryshoreje globale në një funksion, ai tashmë mbetet me të kudo, si në funksion ashtu edhe jashtë tij.

Variabla lokale.

Kur deklaroni një ndryshore në një funksion, ajo bëhet lokale dhe mund të arrihet vetëm nga brenda funksionit. Duhet të theksohet se deklaratat nëse / tjetër, për, ndërsa, po ... ndërsa nuk ndikojnë në fushën e ndryshoreve.

Pra rezulton se në një funksion mund të aksesoni një ndryshore globale, por globalisht jashtë një funksioni nuk mund të aksesoni një ndryshore lokale të krijuar në trupin e funksionit. Le të shohim një shembull.

Funksioni dyshe () (var a \u003d 6; alarm kthimi (a * a);) dyfish (); dokument.shkruaj (a); // duke u përpjekur për të hyrë në një ndryshore lokale

Në shembull, ndryshorja nuk deklarohet globalisht, por deklarohet në funksion, domethënë lokalisht. Pastaj ne e quajmë funksionin dhe përpiqemi të hyjmë në ndryshoren lokale, si rezultat, asgjë nuk ndodh, dhe në tastierë shohim një gabim që variabla nuk është e përcaktuar.

Dhe opsioni i fundit është kur të krijohen një ndryshore globale dhe një ndryshore lokale me të njëjtin emër, çfarë do të ndodhë atëherë. Le të shohim një shembull.

Var a \u003d 7; funksioni double () (var a \u003d 6; alarm kthimi (a * a);) dokumenti.write (a);

Siç mund ta shihni këtu, në funksion, është sikur krijohet një ndryshore tjetër, pavarësisht nga fakti se emri i saj përkon me atë global dhe është ndryshorja lokale që do të jetë e disponueshme në funksion; nuk do të jetë në gjendje të mbishkruaj atë globale, siç tregon ky shembull.

Çfarë përfundimi mund të nxirret nga e gjithë kjo? Kjo është arsyeja pse përpjekja për të përdorur variabla me emra të ndryshëm si brenda ashtu edhe jashtë funksionit. Por ju duhet të dini për qëllimet lokale dhe globale.

Rezultatet

Një ndryshore e krijuar jashtë një funksioni është globale.

Nga funksioni, mund të hyni në variablin global dhe të ndryshoni vlerën e tij.

Variablat shërbejnë si "kontejnerë" për ruajtjen e informacionit.

A ju kujtohet algjebra e shkollës?

A ju kujtohet algjebra e shkollës? x \u003d 5, y \u003d 6, z \u003d x + y

A ju kujtohet se një shkronjë (p.sh. x) mund të ishte përdorur për të ruajtur një vlerë (p.sh. 5), dhe se ju mund të përdorni informacionin e mësipërm për të llogaritur që z është 11?

Këto letra quhen ndryshoret, dhe variablat mund të përdoren për të ruajtur vlerat (x \u003d 5) ose shprehjet (z \u003d x + y).

Variablat JavaScript

Ashtu si në algjebër, variablat JavaScript përdoren për të ruajtur vlerat ose shprehjet.

Një variabël mund të ketë një emër të shkurtër, të tillë si x, ose një emër më përshkrues, siç është emri i veturës.

Rregullat për emrat e ndryshoreve JavaScript:

  • Emrat e ndryshueshëm janë të ndjeshëm në shkronja të mëdha (y dhe Y janë dy ndryshore të ndryshme)
  • Emrat e ndryshueshëm duhet të fillojnë me një shkronjë ose nënvizim

Koment: Meqenëse JavaScript është i ndjeshëm në shkronja të mëdha, emrat e ndryshoreve janë gjithashtu të ndjeshëm në shkronjat e mëdha.

Shembull

Vlera e një ndryshore mund të ndryshojë gjatë ekzekutimit të skriptit. Ju mund t’i referoheni një ndryshoreje me emrin e saj për të shfaqur ose ndryshuar vlerën e saj.

Deklarimi (Krijimi) i Variablave JavaScript

Krijimi i variablave në JavaScript referohet më shpesh si variabla "deklarues".

Ju po deklaroni variablat JavaScript duke përdorur fjalën kyçe var:

Pas ekzekutimit të sugjerimeve të mësipërme, ndryshorja x do të përmbajë vlerën 5 dhe emri i makinës do të përmbajë vlerën Mercedes.

Koment: Kur caktoni një vlerë teksti në një ndryshore, mbylleni atë në thonjëza.

Koment: Nëse ri-deklaroni një ndryshore, ajo nuk do të humbasë vlerën e saj.

Variablat Lokale të JavaScript

Bëhet një variabël e deklaruar brenda një funksioni JavaScript LOKAL dhe do të jetë në dispozicion vetëm brenda këtij funksioni. (ndryshorja ka shtrirje lokale).

Ju mund të deklaroni ndryshoret lokale me të njëjtin emër në funksione të ndryshme, sepse ndryshoret lokale njihen në funksionin në të cilin janë deklaruar.

Variablat lokale shkatërrohen kur funksioni del.

Ju do të mësoni më shumë rreth funksioneve në mësimet e mëvonshme JavaScript.

Variablat Globale JavaScript

Variablat e deklaruara jashtë funksionit bëhen GLOBAL, dhe të gjitha skriptet dhe funksionet në faqe mund t'i kenë ato.

Variablat globale shkatërrohen kur mbyllni faqen.

Nëse deklaroni një ndryshore pa përdorur "var", ndryshorja gjithmonë bëhet GLOBAL.

Caktimi i vlerave për variablat e pa deklaruar JavaScript

Nëse i caktoni vlera variablave që nuk janë deklaruar ende, ndryshoret do të deklarohen automatikisht si variabla globale.

Këto sugjerime:

Ju do të mësoni më shumë rreth operatorëve në udhëzuesin tjetër JavaScript.

Variablat globale në javascript

Cilat janë variablat globale: variablat janë "të dukshëm" në çdo pikë të ekzekutimit të programit, kudo që mund të lexohen dhe të mbishkruhen.
Zakonisht variablat globale përcaktohen në fillim të programit, jashtë çdo blloku (())
në rastin e Js, ato vendosen pas shkrimit, ose të gjitha funksioneve të tjera

hello \u003d "Përshëndetje"; // vendosni një ndryshore globale dhe kontrolloni atë
document.writeln ("-\u003e 1" + përshëndetje + "secili
"); // -\u003e 1 Përshëndetje të gjithëve

Nëse (e vërtetë)
// nëse (false)
{
var hello \u003d "Përshëndetje Dolly dhe"; // kjo është gjithashtu globale
bota \u003d "bota"; // globale
var kont \u003d ", ne vazhdojmë" // globale
document.writeln ("-\u003e 1.2" + përshëndetje + botë + vazhdim + "
");
//1.
}
dokument.writeln ("-\u003e 2" + përshëndetje + botë + vazhdim + "
");
// -\u003e 2 Përshëndetje Dolly dhe botë, ne vazhdojmë

Nëse është e vërtetë, ne marrim përgjigjen

-\u003e 1 Përshëndetje të gjithëve
-\u003e 1.2 Përshëndetje Dolly dhe botë, ne vazhdojmë
-\u003e 2 Përshëndetje Dolly dhe botë, ne vazhdojmë

Ekzekutimi ndërpret

Kështu, rezulton se përdorimi i var nuk ndikon në asnjë mënyrë në fushën globale. Një variabël e përmendur në një skenar jashtë procedurave konsiderohet globale edhe nëse është e mbyllur në kllapa () e nëse ndërsa për bllokun dhe fushat e tjera mbetet globale edhe brenda sytheve

Përfundime, shkurtimisht

* për variablat e përdorur në fushën globale, prania e var nuk është e rëndësishme.
* Bllokon pasi nëse ndërsa nuk krijoni fushëveprim lokal (siç ndodh në gjuhë të tjera)

Variablat lokalë janë variabla të vendosur brenda bllokut (funksionit) të ekzekutueshëm dhe nuk ndikojnë në funksionet e tjera. dhe ambienti i jashtëm, d.m.th. shtrirja globale.

Djali \u003d "Jhone";
bëri \u003d "vret Kenny"; // pra kemi 2 variabla globale
funksioni doit ()
{
// shtypja tashmë ka kaluar --1, dhe ne ndryshojmë të dhënat, ndryshojmë të dhënat
djali var \u003d "Gary"; // krijoni një locale
bëri \u003d "ndihmon Anny"; // ndryshoni globalen
;
document.writeln ("- 2" + djali + "" + bëri + "
");
// - 2 Gary ndihmon Anny
;
// tani, brenda funksionit, vendosni ndryshoret lokale dhe globale
var mirë \u003d "ai ishte një djalë i mirë
"; // vendndodhja!
keq \u003d "ai i pëlqen një vajza të këqija
"; // globale
}
;
document.writeln ("- 1" + djali + "" + bëri + "
");
// - 1 Jhone vret Kenny
beje ();
// - 2 Gary ndihmon Anny
document.writeln ("- 3" + djali + "" + bëri + "
");
// - 3 Jhone ndihmon Anny
;
nëse (! e vërtetë)
// nëse (! false)
{
document.writeln ("- 4" + mirë);
// ekzekutimi i këtij blloku do të shkaktojë një gabim.
// ne aktualisht jemi jashtë fushëveprimit lokal
// funksioni doit (), pra për ne, dhënë përmes var
// ndryshorja e mirë thjesht nuk ekziston
}
document.writeln ("- 5" + keq);
// - 5 ai i pëlqen një vajza të këqija

Rezultati:

1 Jhone vret Kenny
--2 Gary ndihmon Anny
--3 Jhone ndihmon Anny
--5 ai i pëlqen një vajza të këqija

Variablat lokale në javascript

* var punon brenda një funksioni duke deklaruar një ndryshore lokale. Kjo është detyra e tij kryesore.

* Javascript është shumë i ndryshëm nga si në atë që vetëm (?) Brenda një funksioni janë të mundshme ndryshoret lokale.
* përdorimi i var ose mos përdorimi i tij në fushën globale varet vetëm nga përvoja juaj personale. Por për mua është më mirë të mos jem dembel. në margaritar quhet përdorimi i rreptë

\u003e\u003e\u003e var nuk është i rëndësishëm për ndryshoret e përdorura në fushën globale

E rëndësishme Së pari, "vars" nuk mund të fshihet (duke përdorur fshirjen). Së dyti, instantimi i tyre ndodh në "vijën zero" (para fillimit të punës "rresht për rresht"), ku menjëherë u caktohet vlera e papërcaktuar, dhe vetëm atëherë ndryshorja mund të marrë (ose mund të mos marrë) një vlerë të re:

Var glb_1 \u003d 1;
nëse (false) (var glb_2 \u003d 2; glb_3 \u003d 3;)

Alert (glb_1) // instancuar dhe mori vlerën 1
alarm (glb_2) // merrni specifik dhe merrni vlerën 'e papërcaktuar'
alarm (glb_3) // aspak variabël (pa var), gabim gjatë thirrjes

Përditësimi i fundit: 05.04.2018

Të gjitha variablat JavaScript kanë një fushë specifike brenda së cilës mund të veprojnë.

Variablat globale

Të gjitha ndryshoret që deklarohen jashtë funksioneve janë globale:

Këtu ndryshoret x dhe d janë globale. Ato janë të arritshme nga kudo në program.

Por ndryshorja z nuk është globale, pasi përcaktohet brenda funksionit.

Variablat lokale

Një ndryshore e përcaktuar brenda një funksioni është lokale:

Shfaqja e funksionit Sheshi () (var z \u003d 10; console.log (z); le b \u003d 8; console.log (b);)

Variablat z dhe b janë lokale, ato ekzistojnë vetëm brenda funksionit. Ato nuk mund të përdoren jashtë një funksioni:

Shfaqja e funksionitSquare () (var z \u003d 10; console.log (z);) console.log (z); // gabim sepse z është i papërcaktuar

Kur funksioni mbaron punën e tij, atëherë të gjitha variablat e përcaktuar në funksion shkatërrohen.

Fshehja e Variablave

Po sikur të kemi dy variabla, njëri global dhe tjetri lokal, që kanë të njëjtin emër:

Var z \u003d 89; funksioni displaySquare () (var z \u003d 10; console.log (z); // 10) displaySquare (); // dhjetë

Në këtë rast, funksioni do të përdorë ndryshoren z që përcaktohet direkt në funksion. Kjo është, ndryshorja lokale do të fshehë atë globale.

var ose le

Kur përdorni deklaratën let, secili bllok i kodit përcakton një fushë të re në të cilën ekziston ndryshorja. Për shembull, ne mund të përcaktojmë një ndryshore në nivelin e bllokut dhe në nivelin e funksionit në të njëjtën kohë:

Le të jetë z \u003d 10; shfaqja e funksionit Z () (le z \u003d 20; (le z \u003d 30; console.log ("Blloku:", z);) console.log ("Funksioni:", z);) DisplayZ (); console.log ("Global:", z);

Këtu, brenda funksionit displayZ, përcaktohet një bllok kodi në të cilin përcaktohet ndryshorja z. Fsheh ndryshoren globale dhe ndryshoren z të nivelit të funksionit. Në një program real, një bllok mund të përfaqësojë një funksion të vendosur, një lak për, ose nëse deklarata. Por në çdo rast, një bllok i tillë përcakton një fushë të re, jashtë së cilës ndryshorja nuk ekziston.

Dhe në këtë rast, ne marrim daljen e mëposhtme të konsolës:

Bllok: 30 Funksioni: 20 Global: 10

Me deklaratën var, ne nuk mund të përcaktojmë njëkohësisht një ndryshore me të njëjtin emër si në një funksion dhe në një bllok kodi në këtë funksion:

Shfaqja e funksionit Sfera () (var z \u003d 20; (var z \u003d 30; // Gabim! Ndryshorja z është përcaktuar tashmë konsol.log ("Blloku:", z);) console.log ("Funksioni:", z);)

Kjo do të thotë, duke përdorur var, ne mund të përcaktojmë një ndryshore me të njëjtin emër, ose në nivelin e funksionit ose në nivelin e bllokut të kodit.

Konstante

Gjithçka në lidhje me deklaratën let vlen edhe për deklaratën const, e cila ju lejon të përcaktoni konstante. Blloqet e kodeve përcaktojnë shtrirjen e konstanteve, dhe konstantat e përcaktuara në blloqet e kodeve të vendosura fshehin konstante të jashtme me të njëjtin emër:

Ndërtimi z \u003d 10; shfaqja e funksionit Z () (konst. z \u003d 20; (konst. z \u003d 30; konsol.log ("Bllok:", z); // 30) konsol.log ("Funksioni:", z); // 20) ekran Z) ); console.log ("Global:", z); // dhjetë

Variablat e padeklaruar

Nëse nuk e përdorim këtë fjalë kyçe kur përcaktojmë një ndryshore në një funksion, atëherë një ndryshore e tillë do të jetë globale. Për shembull:

Shiriti i funksionit () (foo \u003d "25";) shiriti (); tastierë.log (foo); // 25

Megjithëse foo nuk përcaktohet askund jashtë funksionit të shiritit, ai është akoma i disponueshëm jashtë funksionit në kontekstin e jashtëm.

Do të ishte ndryshe nëse jo vetëm që ia caktonim vlerën variablës, por edhe e përcaktonim atë:

Shiriti i funksionit () (var foo \u003d "25";) shiriti (); tastierë.log (foo); // gabim

mënyra e rreptë

Përcaktimi i ndryshoreve globale në funksione mund të çojë në gabime të mundshme. Për t'i shmangur ato, përdoret modaliteti i rreptë ose modaliteti i rreptë:

"përdorimi i rreptë"; shiriti i funksionit () (foo \u003d "25";) shiriti (); tastierë.log (foo);

Në këtë rast, ne do të marrim një SyntaxError: Gabim identifikues i papritur, i cili tregon që variabli foo nuk është përcaktuar.

Ka dy mënyra për të vendosur modalitetin e rreptë:

    shtoni shprehjen "use strikte" në fillim të kodit JavaScript, atëherë modaliteti strikt do të zbatohet në të gjithë kodin

    shtoni shprehjen "përdorimi i rreptë" në fillim të trupit të funksionit, atëherë mënyra e rreptë do të zbatohet vetëm për këtë funksion

Ky udhëzues me katër pjesë shqyrton se si të shkruani një kod të mirë JavaScript që është i lehtë për tu mirëmbajtur dhe zhvilluar, edhe nëse duhet të ktheheni në një projekt pas një kohe të gjatë.

Shkruani një kod me shpresën se do të duhet të mirëmbahet

Gabimet e softuerit vijnë me një kosto. Kostoja e tyre shprehet në kohën që duhet të shpenzohet për rregullimin e tyre. Gabimet në projektet e lansuara publikisht janë veçanërisht të kushtueshme. Veryshtë shumë mirë nëse mund të rregulloni gabimet menjëherë, kur struktura e kodit është akoma e freskët në kujtesë dhe mund ta gjeni shpejt zonën e problemit. Por nëse keni kaluar në detyra të tjera dhe tashmë keni harruar pjesërisht tiparet e një kodi të caktuar, atëherë kthimi në projekt do të kërkojë:

  • Koha për të studiuar dhe kuptuar problemin.
  • Koha për të kuptuar kodin që është burimi i problemit.

Një problem tjetër që ka të bëjë me projekte ose kompani të mëdha është që personi që rregullon të metat nuk është personi që i krijon ato (dhe shpesh nuk është ai që i gjen në projekt). Prandaj, zvogëlimi i kohës për të kuptuar kodin bëhet një çështje kritike, pavarësisht nëse e keni shkruar vetë kodin disa kohë më parë, ose është shkruar nga një tjetër zhvillues në ekipin tuaj. Përgjigja e pyetjes do të ndikojë ndjeshëm si në rezultatin financiar të projektit ashtu edhe në nivelin e kënaqësisë së zhvilluesve, sepse ndonjëherë është më mirë të bësh gjithçka në një mënyrë të re sesa të kalosh orë dhe ditë duke ruajtur kodin e vjetër të pakuptueshëm.

Një fakt tjetër që lidhet me zhvillimin e softuerit është se zakonisht zgjat më shumë leximi kod, duke mos e krijuar atë. Në përcaktimin fillestar të problemit, zhvilluesi përqendrohet dhe zhyt veten në pyetje, dhe pastaj ulet dhe mund të krijojë një kod të konsiderueshëm në një mbrëmje. Atëherë kodi ndoshta funksionon, por, nga natyra natyrale e produkteve softuer, lindin situata që kërkojnë rishikime të përsëritura të kodit. Për shembull:

  • Identifikohen gabimet.
  • Karakteristika të reja i shtohen projektit.
  • Aplikimi duhet të lëshohet në një mjedis të ri (për shembull, është shfaqur një shfletues i ri).
  • Qëllimi i kodit po ndryshon.
  • Kodi duhet të rishkruhet plotësisht ose të transferohet në një gjuhë tjetër arkitekture ose programuese.

Si rezultat, do të duhen disa orë njeriu për të shkruar kodin, dhe disa ditë njeriu për ta lexuar atë. Prandaj, krijimi i një kodi që mirëmbahet lehtë është thelbësor për suksesin e aplikimit tuaj.

Kodi i lehtë për tu mirëmbajtur ka veçoritë e mëposhtme:

  • Easyshtë e lehtë për t’u lexuar.
  • Isshtë e strukturuar mirë dhe pjesët përshtaten së bashku.
  • Shtë e parashikueshme.
  • Duket sikur është shkruar nga një person.
  • Dokumentuar.

Minimizimi i përdorimit të ndryshoreve globale

JavaScript përdor funksione për të manipuluar kontekstin. Variablat e deklaruara brenda funksioneve janë lokale për to dhe nuk janë të disponueshme jashtë funksioneve. Variablat globale deklarohen jashtë funksioneve ose përdoren thjesht pa deklarim.

Çdo mjedis JavaScript ka një objekt global që përdoret jashtë funksioneve. Çdo ndryshore globale që krijoni bëhet pronë e objektit global. Për lehtësi, shfletuesit kanë një veti shtesë të objektit global të quajtur dritare, e cila (zakonisht) tregon vetë objektin global. Kodi i mëposhtëm tregon një shembull të krijimit dhe hyrjes së ndryshoreve globale në mjedisin e shfletuesit:

Var myglobal \u003d "përshëndetje"; tastierë.log (myglobal); // tastiera "hello". log (dritarja.myglobal); // tastiera "përshëndetje" .log (dritarja ["myglobal"]); // tastiera "hello". log (this.myglobal); // "Përshëndetje"

Problemet me ndryshoret globale

Problemi me ndryshoret globale është se ato do të jenë të disponueshme në të gjithë kodin JavaScript të aplikacionit ose faqes tuaj. Ata janë në hapësirën globale të emrave dhe ka gjithmonë një shans për të emëruar përplasjet kur dy pjesë të ndryshme të aplikacionit përcaktojnë variablat globale me të njëjtin emër por për qëllime të ndryshme.

Gjithashtu, zakonisht, një faqe në internet përfshin kod të shkruar nga zhvillues të tjerë. Për shembull:

  • Biblioteka të tjera JavaScript.
  • Skenaret e partnerit reklamues.
  • Kodi i ndjekjes dhe analizës së përdoruesit.
  • Vegla të ndryshme, butona dhe shtojca.

Le të themi se një nga skriptet e palëve të treta përcakton një ndryshore globale të quajtur, për shembull, rezultat. Pastaj, në një nga funksionet tuaja, ju përcaktoni një ndryshore tjetër globale dhe e quani atë rezultat. Si rezultat, deklarimi i fundit i ndryshores rezultat do të tejkalojë të parën, dhe skenari i palës së tretë mund të ndalojë së funksionuari.

Prandaj, është e rëndësishme të përdorni sa më pak variabla globale për të kombinuar me sukses kodet e ndryshme në të njëjtën faqe. Në këtë pyetje, përdorimi i direktivës var kur deklaron variablat luan një rol thelbësor.

Për fat të keq, është shumë e lehtë të krijosh pa dashje një ndryshore globale në JavaScript për shkak të dy karakteristikave. Së pari, mund të përdorni një ndryshore pa e deklaruar atë. Së dyti, JavaScript ka një përkufizim të nënkuptuar global, që do të thotë se çdo ndryshore që nuk deklarohet bëhet pronë e objektit global (dhe do të jetë në dispozicion si një variabël globale e deklaruar siç duhet). Për shembull:

Shuma e funksionit (x, y) (// keq: rezultati i nënkuptuar global \u003d x + y; rezultati i kthimit;)

Në këtë kod, ndryshorja e rezultatit përdoret pa deklarim. Kodi funksionon mirë, por pasi të telefononi funksionin, do të merrni një ndryshore tjetër të rezultatit në hapësirën globale të emrave, e cila mund të çojë në probleme.

Rregulli i minimizimit është përcaktimi i variablave duke përdorur direktivën var. Më poshtë është një version i përmirësuar i funksionit shuma ():

Shuma e funksionit (x, y) (rezultati var \u003d x + y; rezultati i kthimit;)

Një tjetër mundësi e keqe për krijimin e globaleve të nënkuptuar është zinxhirimi i një vlere brenda një deklarate var. Në shembullin vijues, ndryshorja a do të jetë lokale dhe ndryshorja b do të bëhet globale, e cila ndoshta nuk është në listën e synimeve të krijuesit të kodit:

// keq, mos përdorni funksionin foo () (var a \u003d b \u003d 0; // ...)

Nëse jeni të befasuar nga ajo që po ndodh, atëherë kjo është një llogaritje nga e djathta në të majtë. Shprehja b \u003d 0 ekzekutohet së pari, dhe për këtë arsye ndryshorja b nuk do të deklarohet. Vlera kthyese e shprehjes do të jetë 0, dhe i është caktuar variablës së re lokale a, e cila deklarohet nga direktiva var. Ky përkufizim i variablave është ekuivalent me shënimin vijues:

Var a \u003d (b \u003d 0);

Nëse keni deklaruar tashmë variabla, atëherë pamja me zinxhir do të funksionojë mirë dhe nuk do të krijojë globale të padëshiruara:

Funksioni foo () (var a, b; a \u003d b \u003d 0; // të dy ndryshoret janë lokale)

Një arsye tjetër për të shmangur përdorimin e ndryshoreve globale është transportueshmëria. Nëse planifikoni të ekzekutoni kodin tuaj në një mjedis tjetër, atëherë ndryshoret globale mund të mbishkruajnë objekte që nuk janë të pranishme në mjedisin origjinal (kështu që mund të duket se emri i përdorur është i sigurt).

Efekt anësor i deklaratës var të harruar

Ekziston një ndryshim i vogël midis globaleve të përcaktuara qartë dhe të nënkuptuara. Ai konsiston në aftësinë për të fshirë një ndryshore duke përdorur operatorin e fshirjes:

  • Një ndryshore globale e deklaruar me një deklaratë var (e krijuar jashtë funksioneve në program) nuk mund të fshihet.
  • Një variabël globale e nënkuptuar e krijuar pa një deklaratë (pavarësisht se ku është krijuar) mund të fshihet.

Teknikisht, një ndryshore globale e nënkuptuar është një veti e objektit global, jo një ndryshore. Karakteristikat mund të fshihen duke përdorur operatorin e fshirjes, por ndryshoret nuk mund të:

// përcaktoni tre ndryshore globale var global_var \u003d 1; global_novar \u003d 2; // keq (funksioni () (global_fromfunc \u003d 3; // keq) ()); // Duke u përpjekur të fshini fshini global_var; // fshije false false_novar; // true fshij global_fromfunc; // e vërtetë // Kontrolloni për fshirje të tipit global_var; // "numri" i tipit_novar global; // lloji "i padefinuar" i global_fromfunc; // "i papërcaktuar"

Hyrja në objekt global

Në shfletuesit, objekti global është i disponueshëm kudo në kod përmes vetisë së dritares (nëse nuk bëni diçka të veçantë ose të papritur, siç është deklarimi i një ndryshoreje lokale me emrin dritare). Por në mjedise të tjera, kjo pronë e përshtatshme mund të jetë e disponueshme në një mënyrë tjetër (ose madje nuk është aspak e disponueshme për programuesin). Nëse keni nevojë për qasje në objektin global pa përdorur identifikuesin e dritares, atëherë mund të përdorni metodën e mëposhtme në çdo nivel të hapësirës së emrave të funksionit të futur:

Var global \u003d (funksioni () (ktheje këtë;) ());

Kështu, është gjithmonë e mundur të arrihet objekti global, pasi që brenda një funksioni që quhet si funksion (dhe jo si konstruktor me një deklarim të ri) kjo tregon gjithmonë për objektin global.

Shabllon i vetëm i deklarimit var

Përdorimi i një deklarate të vetme var në krye të funksionit tuaj është një praktikë shumë e dobishme. Kjo metodë ka përparësitë e mëposhtme:

  • Siguron një vend të vetëm për të deklaruar të gjitha ndryshoret lokale të një funksioni.
  • Gabimet Boolean parandalohen kur një variabël përdoret para se të deklarohet.
  • Ju ndihmon të mbani mend të deklaroni ndryshoret lokale dhe për këtë arsye zvogëlon numrin e ndryshoreve globale.

Një shabllon me një deklaratë të vetme var duket kështu:

Funksioni func () (var a \u003d 1, b \u003d 2, shuma \u003d a + b, myobject \u003d (), i, j; // Kodi i funksionit ...)

Ju jeni duke përdorur një deklaratë var për të deklaruar shumë variabla të ndara me presje. Një shtesë e shkëlqyeshme do të ishte inicimi i variablave me të dhënat origjinale kur ato deklarohen. Kjo parandalon gabimet logjike (të gjitha variablat e pa inicializuar nuk përcaktohen si parazgjedhje) dhe përmirëson lexueshmërinë e kodit. Kur shikoni kodin më vonë, si mund ta përcaktoni qëllimin e një ndryshoreje nga vlera e saj fillestare (për shembull, menjëherë do të shihni se është një objekt ose një numër i plotë).

Ju gjithashtu mund të kryeni një veprim kur deklaroni një ndryshore, të tilla si shuma \u003d a + b nga kodi i shembullit të mëparshëm. Manipulimi me DOM është një shembull tjetër i funksionimit. Ju mund të caktoni referenca për elementet DOM tek ndryshoret lokale kur deklaroni:

Përditësimi i funksionitElement () (var el \u003d document.getElementById ("rezultati"), stili \u003d el. Stili; // kryej operacione me el dhe stil ...)

Heqja: problemi me deklaratat e shpërndara var

JavaScript lejon deklarata të shumta var kudo në një funksion, dhe ato funksionojnë njësoj pavarësisht se ku vendosen. Kjo karakteristikë njihet si "ngritje". Kjo sjellje mund të çojë në gabime logjike kur përdorni një ndryshore dhe më pas e deklaroni atë për kodin e mëtejshëm të funksionit. Për JavaScript, meqenëse një ndryshore është në të njëjtën hapësirë \u200b\u200bemrash (në të njëjtin funksion), supozohet të deklarohet, edhe nëse ato përdoren para direktivës var. për shembull

// bad myname \u003d "globale"; // funksioni global i ndryshueshëm func () (alarm (myname); // "undefined" var myname \u003d "local"; alarm (myname); // "local") func ();

Në këtë shembull, thirrja e parë për alarm () pritet të prodhojë mesazhin "global", dhe e dyta në "lokale". Kjo është një pritje e arsyeshme, pasi që në thirrjen e parë variabli lokal myname nuk deklarohet dhe funksioni duhet të përdorë ndryshoren globale myname. Por në realitet, gjithçka funksionon ndryshe. Thirrja e parë për alarm () do të kthehet "e papërcaktuar" sepse myname trajtohet si një ndryshore e deklaruar lokale në funksion (megjithëse do të deklarohet më vonë). Të gjitha deklaratat e ndryshueshme ngrihen lart në funksion. Prandaj, për të shmangur këtë lloj gabimi, duhet të deklaroni të gjitha ndryshoret në krye të funksionit.

Shembulli i mëparshëm do të veprojë sikur të ishte zbatuar kështu:

Myname \u003d "globale"; // funksioni global i ndryshueshëm func () (var myname; // njëlloj si -\u003e var myname \u003d i papërcaktuar; alarm (myname); // "i papërcaktuar" myname \u003d "lokal"; alarm (myname); // " lokale ") func ();

Vlen të përmendet se implementimi aktual i kodit është më kompleks. Ekzistojnë dy faza të përpunimit të kodit. Faza e parë krijon variabla, deklarime të funksioneve dhe parametra zyrtarë dhe përcakton kontekstin. Faza e dytë ekzekuton kodin, vlerëson funksionet dhe krijon identifikues të pakualifikuar (variabla të padeklaruar). Por për përdorim praktik, mund të përdoret koncepti i ngritjes, i cili përshkruan mirë sjelljen e kodit.