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; };
})();