preloader
image

Understanding JS under the hood: var, let and const 🦾

Javascript is one of the top programming languages in this 2021 and I really love it, that’s why today we’re gonna talk about a topic that sometimes is very complex for beginners. To create truly powerfull and great apps, we need to understant how JS manage the variables, functions, call’s, etc. So, let’s talk about variables declaratations and how we have to be carefull in some cases.

ÂżJavascript or ECMAScript?, Âżare they the same?

As we know JS is a programming language whose in the beginning just had the chance to be used in the web browser. ECMAScript is the specification it’s based on. By reading the ECMAScript specification, you learn how to create a scripting language. By reading the JavaScript documentation, you learn how to use a scripting language.

Browsers offers limitations between the standart (JS engines, they interprete the code ), every browser has a different JS engine, it’s like the specific kind of languaje that many parts of a country develop throughout time: english is not the same in Texas or New York. Or the latin spanish in “tepito” or Monterrey.

So, an engine can interprete a specific version of ECMAScript. When dev’s are asking for the ECMAScript version that a browser supports, they really are asking about the engine. Here’s a list that could help to understant better this concept:

Engines and ECMAScript versions with browsers

Engines and ECMAScript versions with browsers

Concluding this part, it’s important to know some limitations that a browser can have when yo’re writting code, well … you can use many tools (babel)to transform your code and forgot about this but that is another topic.

Important concepts

  1. Scope: It’s where these variables are available for use. This could be the entire context like all the windows or file about your writting code or the context inside a function.
  2. Hoisting: Hoisting is a JavaScript mechanism where variables and function declarations are moved to the top of their scope before code execution. That’s why you can call a function before to be declared. No matters where you write that declaration, js move it to the top of file or context, also we have to remember that js just move the declaration not the assignments.

ES5

var

Some years ago before ES6, using var was the most common and ruled way declaration. With var we have two scopes:

  • Global scope: Available in the entire window or file.
  • Function scope: Available locally inside the function block.

index.js

    var name1 = "I'm Jimmy";      //Global scoped

    function myFUnction(){
        var name2 = "I'm Carlos"; //Function scoped    

        console.log(name1)        //Output: I'm Jimmy
    }

    myFunction()
    console.log(name2) //Output: ReferenceError: name2 is not defined

Using var


As you can see in the image above, “name1” can be used inside the function but when we try to show “name2”, we’ll se a reference error because “name2” lives only in myFunction.

Characteristics of var

var variables can be redeclared and reassigned, for example:

index.js

    //First declaration and assignment
    var name = "Xavier"
    //Redeclarated
    var name = "Mr X"
    //Reassigned
    name = "Javier"

    //All this lines won't show any error

This code won´t show error

Problem with var

Imagine your code has a lot of lines and you declared an initial state or variable. Then you declared a variable with the same name inside a function, js won’t warn yout about this action and the system or app can crash or do a different behavior.

Hoisting var

We have to be awared that js engine moves the declaration of var variables to top but also initialize these variables to undefined.

index.js

    //What we write
    console.log(name) //output: undefined
    var name = "Alex"

    //What js understands (Hoisting)
    var name = undefined
    console.log(name) //output: undefined
    name = "Alex"

Hoisting var

Special case: If we don’t declared a variable but we assign a value to it, it does not exist until code assigning it is executed. Therefore, this behavior creates a global variable when the assignment is executed. We most know that undeclared variables are global variables.

index.js

    name = "Jimmy" //JS convert name into a global variable

    console.log(name) //output: "Jimmy"

Undeclared variables are global variables


ES6

let

Some of the problems of var came to be solved with ES6, today let is the ruled of preferred variable declaration. It solves the main problem with var.

  • Block scope: A block is considered as a piece of code bounded by curly braces {}.

index.js

    let counter = 5

    if(counter > 1){
        let name2 = "I'm Carlos"; //name2 is block scoped
    }
    console.log(name2) //name2 doesn't exist here

Block scope


So, in the example above we see that “name2” no exists after the curly braces that bounded the if statement. To be sure, let’s se other example:

index.js

    let car = "Jetta Classic";
    let counter = 1
    if(counter > 0){
        let car = "Ferrari 2020";
        console.log(car); // "output: "Ferrari 2020"
    }
    console.log(car); //output: "Jetta Classic"

This code won’t show errors


With var, this piece of code could be read as redeclare “car” but that would be a mistake. Every variable in this example lives in it’s own scope, that’s why we see in the last line the value of the first assignment, we’re not changin the value of car, just declarating car in two scopes.

Characteristics of let

Unlike var, let could be reassigned but we cannot redeclare it in the same scope. If we do this, gonna get an error:

index.js

    let car = "Jetta Classic";
    let car = "Ferrari" //output: Identifier 'car' has already been declared

Solves the problem with var


Hoisting let

As we remember, js moves the var declaration assigning undefined on the top. In this case, the hoisting is almost the same but not assigning any value to the variable and showing reference error.

index.js

    //What we write
    console.log(name) //output: Cannot acces 'name' before initialization
    let name = "Alex"

    //What js understands (Hoisting)
    let name //Not assigned
    console.log(name) //output: Cannot acces 'name' before initialization
    name = "Alex"

Hoisting let


const

Using const variables is recomended if you want to maintain the value assigned to a variable in all the context. We have here the same similarities like using let. Also const is block scoped.

Characteristics of const

After the assigment with const, we cannot update the value. So, we cannot reassign or redeclare a variable.

index.js

    const pi = 3.1416

    pi = 3.15 //output: Assignment to constant variable

With const, it’s not possible to redeclared or reassign a value


Hoisting const: Just like let these declarations are hoisted but not assigned. Also we cannot just declare a const variable, we most initialized it.



After all this explanation, I hope your js knowledge will be better and more strong. Some times we talk about JS without understanding it under the hood, but when you cross the line you become a ninja ❤.



WRITTEN BY Jimmy Vasquez Follow

Software Engineer📱 Editor on Nerd For Tech 👔 Geek ❤ Feb 1 5 min read Javascript |