Вар, Лет и Цонст - у чему је разлика?

Много сјајних нових функција је изашло са ЕС2015 (ЕС6). А сада, с обзиром да је 2020. година, претпоставља се да су се многи програмери ЈаваСцрипт-а упознали и почели да користе ове функције.

Иако би ова претпоставка могла бити делимично тачна, ипак је могуће да неке од ових карактеристика остају мистерија за неке програмере.

Једна од карактеристика које су испоручене са ЕС6 је додавање letи const, које се могу користити за декларацију променљивих. Питање је шта их разликује од добрих varкоје смо користили? Ако вам ово још увек није јасно, онда је овај чланак за вас.

У овом чланку ћемо разговарати var, letа const  у вези са њиховом обиму, употреба и истицање. Док читате, забележите разлике између њих на које ћу указати.

Вар

Пре појаве ЕС6, varвладале су декларације. Постоје проблеми повезани са променљивим декларисаним са var. Због тога је било неопходно да се појаве нови начини декларисања променљивих. Прво, схватимо varвише пре него што разговарамо о тим питањима.

Обим вар

Опсег у основи значи где су ове променљиве доступне за употребу. varдекларације се примењују глобално или функционишу / локално.

Опсег је глобални када је varпроменљива декларисана изван функције. То значи да је било која променљива која је декларисана varизван функционалног блока доступна за употребу у целом прозору.

varје функција опсега када је декларисана унутар функције. То значи да је доступан и да му се може приступити само у оквиру те функције.

Да бисте даље разумели, погледајте пример испод.

 var greeter = "hey hi"; function newFunction() { var hello = "hello"; } 

Овде greeterје глобално опсег јер постоји изван функције, док helloје опсег функције. Дакле, не можемо приступити променљивој helloизван функције. Па ако урадимо ово:

 var tester = "hey hi"; function newFunction() { var hello = "hello"; } console.log(hello); // error: hello is not defined 

Добићемо грешку која је резултат тога што helloније доступан изван функције.

променљиве променљиве могу се поново декларисати и ажурирати

То значи да то можемо учинити у истом опсегу и да неће добити грешку.

 var greeter = "hey hi"; var greeter = "say Hello instead"; 

и ово такође

 var greeter = "hey hi"; greeter = "say Hello instead"; 

Подизање вар

Подизање је ЈаваСцрипт механизам где се променљиве и декларације функција премештају на врх свог опсега пре извршавања кода. То значи да ако ово урадимо:

 console.log (greeter); var greeter = "say hello" 

тумачи се овако:

 var greeter; console.log(greeter); // greeter is undefined greeter = "say hello" 

Дакле, varваријабле се подижу на врх свог опсега и иницијализују са вредношћу undefined.

Проблем са вар

Постоји слабост која долази са   var. Користићу пример испод да објасним:

 var greeter = "hey hi"; var times = 4; if (times > 3) { var greeter = "say Hello instead"; } console.log(greeter) // "say Hello instead" 

Дакле, пошто times > 3враћа труе, greeterредефинисано је у "say Hello instead". Иако ово није проблем ако свесно желите greeterда будете редефинисани, то постаје проблем када не схватите да је променљива greeterвећ раније дефинисана.

Ако сте користили greeterу другим деловима кода, можда ћете се изненадити резултатима који се могу добити. Ово ће вероватно проузроковати пуно грешака у вашем коду. Због тога су letи constнеопходни.

Дозволити

letје сада пожељна за декларацију променљиве. Није изненађење јер представља побољшање varдекларација. Такође решава проблем са varоним што смо управо покрили. Размотримо зашто је то тако.

нека је блок опсега

Блок је део кода ограничен са {}. Блок живи у завојима. Све унутар коврџавих заграда је блок.

Дакле, променљива декларисана у блоку са let  је доступна само за употребу у том блоку. Објаснићу ово на примеру:

 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 

We see that using hello outside its block (the curly braces where it was defined) returns an error. This is because let variables are block scoped .

let can be updated but not re-declared.

Just like var,  a variable declared with let can be updated within its scope. Unlike var, a let variable cannot be re-declared within its scope. So while this will work:

 let greeting = "say Hi"; greeting = "say Hello instead"; 

this will return an error:

 let greeting = "say Hi"; let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared 

However, if the same variable is defined in different scopes, there will be no error:

 let greeting = "say Hi"; if (true) { let greeting = "say Hello instead"; console.log(greeting); // "say Hello instead" } console.log(greeting); // "say Hi" 

Why is there no error? This is because both instances are treated as different variables since they have different scopes.

This fact makes let a better choice than var. When using let, you don't have to bother if you have used a name for a variable before as a variable exists only within its scope.

Also, since a variable cannot be declared more than once within a scope, then the problem discussed earlier that occurs with var does not happen.

Hoisting of let

Just like  var, let declarations are hoisted to the top. Unlike var which is initialized as undefined, the let keyword is not initialized. So if you try to use a let variable before declaration, you'll get a Reference Error.

Const

Variables declared with the const maintain constant values. const declarations share some similarities with let declarations.

const declarations are block scoped

Like let declarations, const declarations can only be accessed within the block they were declared.

const cannot be updated or re-declared

This means that the value of a variable declared with const remains the same within its scope. It cannot be updated or re-declared. So if we declare a variable with const, we can neither do this:

 const greeting = "say Hi"; greeting = "say Hello instead";// error: Assignment to constant variable. 

nor this:

 const greeting = "say Hi"; const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared 

Every const declaration, therefore, must be initialized at the time of declaration.

This behavior is somehow different when it comes to objects declared with const. While a const object cannot be updated, the properties of this objects can be updated. Therefore, if we declare a const object as this:

 const greeting = { message: "say Hi", times: 4 } 

while we cannot do this:

 const greeting = { words: "Hello", number: "five" } // error: Assignment to constant variable. 

we can do this:

 greeting.message = "say Hello instead"; 

This will update the value of greeting.message without returning errors.

Hoisting of const

Just like let, const declarations are hoisted to the top but are not initialized.

So just in case you missed the differences, here they are:

  • var declarations are globally scoped or function scoped while let and const are block scoped.
  • var variables can be updated and re-declared within its scope; let variables can be updated but not re-declared; const variables can neither be updated nor re-declared.
  • They are all hoisted to the top of their scope. But while var variables are initialized with undefined, let and const variables are not initialized.
  • Иако се varи letможе декларисати без иницијализације, constмора се иницијализовати током декларације.

Имате ли питања или додатака? Молим те обавести ме.

Хвала вам за читање :)