ES5에서 변수를 선언할 수 있는 유일한 방법은 var키워드를 사용하는 것이었다.
하지만 var키워드로 선언된 변수는 아래와 같은 문제점들이 있다.
스코프란 변수가 사용될 수 있는 영역을 말한다.
// var변수 i는 변수가 정의가 되어진 위치에서 결정이 나게 된다.
function example() {
var i = 1;
}
// 함수 스코프에서 벗어난 곳에서 사용하는 경우 에러가 나게 된다.
console.log(i);
//전역변수로서 사용되어지는 것을 피하기 위해서 'use strict'를 선언할 수 있습니다.
'use strict';
function example1() {
i = 1;
//변수 i는 전역변수로서 다른 함수에서도 사용할 수 있습니다.
}
function example2() {
console.log( i );
}
example1(); // example1에서 넣었던 값이
example2(); // example2에서 출력된다.
for문,while문,switch문,if문 등 함수 내부에서 작성되는 모든 코드가 계속 남아 있는 문제가 있다.
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log('last:', i);
// for문이 끝난 이후에도 i값을 출력하게 됨
위의 문제를 해결하기 위해서 '즉시실행 함수'를 사용하기도 한다.
즉시실행 함수는 바로 실행을 하고 사라지는 함수를 말한다.
(function () {
for (var i = 0; i < 10; i++) {
console.log(i);
}
})();
console.log('last:', i);
// 함수 레벨로 바뀌어 scope가 설정되어졌기 때문에 에러 발생
var myVar=1;
var myVar=2; //재정의
위와 같은 코드가 에러 없이 사용될 수 있다는 것은 직관적이지 않으며 버그로 이어지기 쉽다.
var PI = 3.141592;
PI = 123; //재할당
이러한 var변수의 문제점을 보안하기 위해 ES6은 let과 const키워드를 도입하였다고 볼 수 있다.
참고사이트 :
변수var의 문제점
https://velog.io/@crewd/JS-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-var%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90
https://velog.io/@groovejumat/%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B81.-var-%EB%B3%80%EC%88%98%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90
https://gist.github.com/LeoHeo/7c2a2a6dbcf80becaaa1e61e90091e5d