var, let, const

Peter Chen

2018-02-04

var
VS
let/const

Hoisting

// Var Declarations are hoisted to the top of the function definition.
function varDemo(condition) {
  // var dec;
  
  console.log(dec); // undefined
  if (condition) {
    var dec = "var";  // dec = "var";
    console.log(dec); // var
  } else {
    console.log(dec); // undefined
  }
}

var

Block Bindings

// Let/Const Declarations are Block Bindings.
// They are not hoisted.
function letDemo(condition) {
  console.log(dec); // ReferenceError: dec is not defined
  if (condition) {
    let dec = "var";
    console.log(dec); // var
  } else {
    console.log(dec); // ReferenceError: dec is not defined
  }
}

let/const

Temporal Dead Zone

function TDZDemo(condition) {
  console.log(typeof varDec); // undefined
  var varDec = "var";

  // ReferenceError: can't access lexical declaration `letDec' before initialization
  console.log(typeof letDec);
  let letDec = "let";

  console.log(typeof letInOtherBlock); // undefined
  if (condition) {
    let letInOtherBlock = "letInOtherBlock";
  }
}

No Redeclaration

function demo(){
  var dec = 'var';
  let dec = 'let'; // SyntaxError: redeclaration of var dec
}

function demo2(condition){
  var dec = 'var';
  if(condition){
    // it creates a new variable called dec within the if statement
    let dec = 'let';  
  }
}

let/const

Global Block Bindings

var globalVar = 'var';

console.log(window.globalVar);  // var

let globalLet = 'let';

console.log(window.globalLet);  // undefined

let
VS
const

Initialization

// Initialization
function initialization(){
  const haveInitialConst = 'dec';
  const haveNotIntialConst;  // Uncaught SyntaxError: Missing initializer in const declaration
  
  let haveInitialLet = 'dec';
  let haveNotIntialLet;
}

Reassign

function reassign(){
  const constDec = 'const';
  constDec = 'reassign';  // TypeError: invalid assignment to const `constDec'
  
  let letDec = 'let';
  letDec = 'reassign';
}

value of Objects can modified

function reassignValueInObj(){
  const pet = {
    name: 'Peter'
  };
  
  pet.name = 'Sunny';
  
  console.log(pet.name);  //Sunny
}

const

var let/const
Scope Hoisting Block Bindings(TDZ)
Redeclaration Yes No
Global Yes No

var VS let/const

let const
Initialization Optional Necessary
Reassign Yes No(except value of objects)

let VS const

Reference

Thank You

var, let, const

By Peter Chen

var, let, const

Comparison between var, let and const.

  • 192