Original article: Var, Let, and Const – What's the Difference?
Vipengele vingi vipya vilitoka na ES2015 (ES6). Na sasa, kwa kuwa ni 2020, inadhaniwa kuwa wasanidi programu wengi wa JavaScript wamevifahamu na kuanza kutumia vipengele hivi.
Ingawa dhana hii inaweza kuwa kweli kwa kiasi, bado kuna uwezekano kwamba baadhi ya vipengele hivi hubakia kuwa fumbo kwa baadhi ya wasanidi programu.
Moja ya vipengele vilivyokuja na ES6 ni ikiwemo nyongeza ya let
na const
, ambayo inaweza kutumika kwa tamko la kutofautiana. Swali ni, ni nini huifanya kuwa tofauti na var
ambayo tumekuwa tukitumia? Ikiwa bado haujui juu ya hili, basi nakala hii ni kwa ajili yako.
Katika makala haya, tutajadili var
, let
na const
kwa heshima na upeo wao, matumizi, na kuinua. Unaposoma, zingatia tofauti kati yao ambayo nitaonyesha.
Var
Kabla ya ujio wa ES6, tamko la var lilitawala. Ingawa kuna maswala yanayohusiana na anuwai zilizotangazwa na var
, Ndiyo maana ilikuwa ni lazima kuwa njia mpya za kutangaza vigezo. Kwanza, hebu tupate kuelewa var
kwa zaidi kabla ya kujadili masuala hayo ibuka.
Upeo (scope) wa var
Kwa kimsingi Upeo una maana ya mahali ambapo anuwai(variables) hizi zinapatikana kwa matumizi. Tamko la var
lina upeo wa kimsingi au utendakazi/katika maeneo ya ndani ya kazi.
Upeo ni wa kimsingi wakati utofauti wa var
unatangazwa nje ya chaguo la kukokotoa(function). Hii ina maana kwamba kigezo chochote ambacho kimetangazwa na var
nje ya kizuizi cha kukokotoa kinapatikana kwa matumizi katika function nzima.
var
ni chaguo la function linapotangazwa ndani ya chaguo la function. Hii ina maana kwamba inapatikana na inaweza kupatikana tu ndani ya kazi(function) hiyo.
Ili kuelewa zaidi, angalia mfano hapa chini.
var greeter = "hey hi";
function newFunction() {
var hello = "hello";
}
Hapa, greeter
hutanguliwa globally kwa sababu iko nje ya function ilhali hello
,iko ndani ya function. Kwa hivyo hatuwezi kufikia hello
nje ya function. Kwa hivyo ikiwa tutafanya hivi:
var tester = "hey hi";
function newFunction() {
var hello = "hello";
}
console.log(hello); // error: hello is not defined
Tutapata hitilafu ambayo ni matokeo ya hello
kutopatikana nje ya chaguo la kukokotoa.
var vigezo vinaweza kutangazwa tena na kusasishwa
Hii inamaanisha kuwa tunaweza kufanya hivi ndani ya eneo moja na hatutapata hitilafu.
var greeter = "hey hi";
var greeter = "say Hello instead";
na hii pia,
var greeter = "hey hi";
greeter = "say Hello instead";
Upandishaji (hoisting) wa var
Hoisting ni utaratibu wa JavaScript ambapo anuwai na matamko ya utendakazi huhamishwa hadi juu ya upeo wao kabla ya utekelezaji wa simba. Hii ina maana kwamba tukifanya hivi:
console.log (greeter);
var greeter = "say hello"
Inatafsiriwa kama ifuatavyo:
var greeter;
console.log(greeter); // greeter is undefined
greeter = "say hello"
Kwa hivyo anuwai ya var
huinuliwa(is hoisted) juu ya upeo wao na kuanzishwa kwa thamani isiyofafanuliwa.
Tatizo na var
Kuna udhaifu unaokuja na var. Nitatumia mfano hapa chini kuelezea:
var greeter = "hey hi";
var times = 4;
if (times > 3) {
var greeter = "say Hello instead";
}
console.log(greeter) // "say Hello instead"
Kwa hivyo, kwa kuwa times > 3
ni kweli, greeter
inafafanuliwa upya kuwa say Hello instead
. Ingawa hii sio shida ikiwa kwa kujua unataka greeter
ifafanuliwe upya, inakuwa shida wakati hautambui kuwa anuwai greeter
inayobadilika tayari imefafanuliwa hapo awali.
Ikiwa umetumia greeter
katika sehemu zingine za nmsimbo wako, unaweza kushangazwa na matokeo ambayo unaweza kupata. Hii inaweza kusababisha hitilafu nyingi kwenye msimbo wako. Ndio maana let
and const
ni muhimu.
Let
let
sasa inapendelewa kwa variable declaration. Haishangazi kwani inakuja kama uboreshaji wa matamko ya var
(var declarations). Pia hutatua tatizo la var
ambalo tumeshughulikia hivi punde. Hebu tuchunguze kwa nini hii ni hivyo.
Let ni block scoped
Kizuizi ni sehemu ya msimbo iliyopakana na {}. A Block huishi kwenye viunga vilivyopinda.(curly braces). Kitu chochote ndani ya viunga vilivyopinda ni block.
Kwa hivyo anuwai iliyotangazwa kwenye block na let
inapatikana tu kwa matumizi ndani ya kizuizi hicho. Wacha nieleze hii kwa mfano:
let greeting = "say Hi";
let times = 4;
if (times > 3) {
let hello = "say Hello instead";
console.log(hello);// "say Hello instead"
}
console.log(hello) // hello is not defined
Tunaona kwamba kutumia hello
nje ya kizuizi chake (viunga vilivyopinda ambapo ilifafanuliwa) inarudisha kosa. Hii ni kwa sababu anuwai za let
ni block scoped.
let inaweza kusasishwa lakini isitangazwe tena
Kama tu var
, kigezo kilichotangazwa na let
kinaweza kusasishwa(updated) ndani ya upeo wake. Tofauti na var
, let
haiwezi kutangazwa tena(re-declared) ndani ya upeo wake. Kwa hivyo wakati hii itafanya kazi:
let greeting = "say Hi";
greeting = "say Hello instead";
Hii itarejesha kosa:
let greeting = "say Hi";
let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared
Walakini, ikiwa anuwai sawa zitafafanuliwa katika upeo tofauti, hakutakuwa na kosa:
let greeting = "say Hi";
if (true) {
let greeting = "say Hello instead";
console.log(greeting); // "say Hello instead"
}
console.log(greeting); // "say Hi"
Kwa nini hakuna makosa? Hii ni kwa sababu matukio yote mawili yanachukuliwa kama vigezo tofauti kwani vina upeo tofauti.
Ukweli huu hufanya let
kuwa chaguo bora kuliko var
. Unapotumia let
, sio lazima ujisumbue ikiwa umetumia jina kwa anuwai hapo awali kwani anuwai ipo ndani ya upeo wake tu.
Pia, kwa kuwa anuwai haiwezi kutangazwa zaidi ya mara moja ndani ya upeo, basi shida iliyojadiliwa mapema ambayo hufanyika na var
haifanyiki.
Upandaji wa let
Kama tu var
, matamko ya let
hupandishwa juu. Tofauti na var
ambayo imeanzishwa kama undefined
), neno kuu la let
halijaanzishwa(initialized). Kwa hivyo ukijaribu kutumia anuwai ya let
kabla ya tamko, utapata Reference error
.
Const
Vigezo vilivyotangazwa na const
hudumisha thamani zisizobadilika. Matamko ya const
hushiriki baadhi ya mfanano na matamko ya let
.
matamko ya const ni block scoped
Kama vile matamko ya let
, matamko ya const
yanaweza kupatikana tu ndani ya kizuizi ambacho yalitangazwa.
const haiwezi kusasishwa au kutangazwa tena
Hii inamaana kuwa thamani ya kigezo kilichotangazwa na const
inabaki sawa ndani ya upeo wake. Haiwezi kusasishwa au kutangazwa tena. Kwa hivyo ikiwa tutatangaza kidokezo na const
, hatuwezi kufanya hivi:
const greeting = "say Hi";
greeting = "say Hello instead";// error: Assignment to constant variable.
wala hivi:
const greeting = "say Hi";
const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared
Kwa hivyo, kila tamko la const
, lazima lianzishwe wakati wa tamko.
Tabia hii ni tofauti kwa namna fulani inapokuja kwa vitu vilivyotangazwa na const
. Ingawa kipengee cha const
hakiwezi kusasishwa, sifa za vitu hivi zinaweza kusasishwa. Kwa hivyo, ikiwa tutatangaza kitu cha const
kama hii:
const greeting = {
message: "say Hi",
times: 4
}
wakati hatuwezi kufanya hivi:
greeting = {
words: "Hello",
number: "five"
} // error: Assignment to constant variable.
tunaweza kufanya hivi:
greeting.message = "say Hello instead";
Hii itasasisha thamani ya greeting.message
bila kurudisha makosa.
Upandaji wa const
Kama tu let
, matamko ya const
yameinuliwa juu lakini hayajaanzishwa.
Kwa hivyo ikiwa umekosa tofauti, hizi hapa:
- matamko ya
var
yana upeo wa global au function hukulet
naconst
zikiwa block scoped. - vigezo vya
var
vinaweza kusasishwa na kutangazwa tena ndani ya upeo wake; vigezo vyalet
vinaweza kusasishwa lakini si kutangazwa tena; vigezo vyaconst
haviwezi kusasishwa wala kutangazwa tena. - Vyote vinaweza kuinuliwa juu ya upeo wao. Lakini wakati vigeu vya
var
vinaanzishwa naundefined
, vigezo vyalet
naconst
hazijaanzishwa. - Ingawa
var
nalet
inaweza kutangazwa bila kuanzishwa,const
lazima ianzishwe wakati wa tamko.
Je, una maswali au nyongeza? Tafadhali nijulishe.
Asante kwa kusoma :)