var
- var는
function-scoped
이다.
function-scoped??
/*
* a는 변수가 정의되어진 함수 내에서 결정이 난다.
*/
function scoped(){
var a = 1;
console.log(a); // 1
}
/*
* function-scope에서 벗어난 위치에서 호출할 시 에러가 나게 된다.
*/
console.log(a); // ReferenceError: a is not defined
var를 사용하지 않고 변수를 할당한다면
/*
* 해당 함수의 변수 a는 전역변수가 된다.
*/
function ex1(){
a = 1;
}
/*
* 전역변수는 다른 함수에서도 사용이 가능하다.
*/
function ex2(){
console.log(a);
}
ex1(); // 전역변수 a = 1 선언
ex2(); // 1
for문에서의 var(1)
/*
* function-scope인 var의 경우 for문에서 정의된 변수나 반복문이 종료된 이후에도
* 존재하는 현상이 생긴다.
* (js에 하나의 거대한 함수가 둘러싸여져 있다고 생각하면 된다.)
*/
for(var i = 0; i < 10; i++){
console.log(i);
}
console.log(i); // for문에서 선언했던 i의 변수가 그대로 출력이 되는것을 확인할 수 있다.
for문에서의 var(2)
/*
* 위의 문제를 해결하기 위해 '즉시실행 함수'를 사용하기도 한다.
* var이 function-scope인것을 이용해서 for문을 함수로 감싸는 방법이다.
* 하지만 보시다시피 가독성이 최악이기 때문에 이렇게까지 어렵게 사용하는것은 무리다.
*/
(function(){
for(var i = 0; i < 10; i++){
console.log(i);
}
})();
console.log(i); // ReferenceError: a is not defined
hoisting(1)
/*
* var로 정의된 변수는, 그 변수가 속한 scope의 최상단으로 끌어올려진다.
*/
var a;
console.log(a); // 바로 아래의 a = 1이 호이스팅되어 1이 출력이 된다.
a = 1;
hoisting(2)
/*
* 이처럼 직관적이지 않은 코드를 작성해도 아무 문제 없이 작동된다.
*/
console.log(a);
a = 2;
console.log(a);
var a = 1;
재할당
/*
* 모든 var는 재할당이 가능하다.
* 모든 var는 재할당이 가능한 변수로밖에 만들지 못한다.
*/
var a = 1;
var b = 2;
var PI = 3.14;
PI = 12345; // 변수 재할당이 가능하다.
Reference
groovejumat.log
gist.github.com/LeoHeo