//

ES6 LET & CONST

If you are familiar with JavaScript, you have probably known the term scope. If you are familiar with other languages, you would know that a scope of a variable is to the nearest block – block scope. But JavaScript is different. A variable created with var will be scoped to the nearest parent function.

let

We can imagine that let is a new var statement. But there is no need to replace every var with let, but only when you require a block scoped variables.

Firstly, imagine and old way (and still valid) to declare a new variable in your JS code using ES5:

var foo = 1;

console.log(foo); // 1

{
  var bar = 2;
  console.log(bar); // 2
}

function fn() {
  console.log(foo); // undefined
  var foo = 3;
  console.log(foo); // 3
}

fn();

console.log(foo); // 1
console.log(bar); // 2

Now lets write the same code using let:

let foo = 1;

console.log(foo); // 1

{
  let bar = 2;
  console.log(bar); // 2
}

function fn() {
  console.log(foo); // undefined
  var foo = 3;
  console.log(foo); // 3
}

fn();

console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined

As we can see, this time only variable foo is declared as a global. let gives us a way to declare block scoped variables, which is undefined outside it.

REPL

You can use Babel or Traceur to transpile ES6 code.

const

const is single-assignment and like a let, block-scoped declaration.

{
 const PI = 3.141593;
 PI = 3.14; // throws "PI" is read-only
}

console.log(PI); // throws ReferenceError: PI is not defined

const cannot be reinitialized. It will throw an Error when we try to assign another value.

Let’s look for the equivalent in ES5:

var PI = (function () {
  var PI = 3.141593;
  return function () { return PI; };
})();