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