let, const, and blocks

  • LET is block scoped (ES5: function scope)
  • var 키워드를 사용할 경우는 블록문(if, for, while)은 별도의 공간을 가지지 않는다.
  • ES6(ECMAScript 2015)에서는 let 키워드가 등장했는데 let 키워드를 블록문 내부에서 사용할 경우, 별도의 공간이 형성이 된다.

1. let

// var foo = 1;
let foo = 2;
foo = 3; // foo 재활당

Using var declaration

var a = 1;

if (true) {
    var b = 2;
}

console.log(a+b); // 3

Using let declaration

let c = 1;

if(true) {
    let d = 2; // `d`는 {} block scoped 이다.
}

console.log(c + d); // ReferenceError : d is not defined.

Let Example

let a = 1;

if(true) {
    let a = 2;
    console.log(a); // 2
}

console.log(a); // 1

var vs let Closure

// IIFE 사용해서 closure
for(var i = 0; i < 6; i++) {
    (function(j) {
        setTimeout(function() {
            console.log(j); // 1,2,3,4,5
        }, j * 1000));
    },(i);
}
// let가 {} block scoped가 이므로 closure가 된다
for(let k = 0; k < 6; k++) {
    setTimeout(function() {
        console.log(k); // 1,2,3,4,5
    }, k * 1000));
}

let with looping

for(var i = 0; i < 10; i++) {
    console.log(i);
}
console.log(i);

for(let i = 0; i < 10; i++) {
    console.log(i);
}
console.log(i);

2. const

  • Means “Constant” 변하지 않는?
  • 재활당 안 된다
const foo = 1;
foo = 2; // SyntaxErro Assignment to constant variable

Using const declaration

const c = 1;

if(true) {
    const d = 2; // `d`는 {} block scoped 이다.
}

console.log(c + d); //`d`는 {} block scoped 이다.
const a = [1,2,3];
a.push(4);

console.log(a); //[1,2,3,4]

const b = {
    name: 'b'
};
b.name = 'bb';

console.log(a); // name: bb