값을 저장하기 위해 확보한 메모리 공간 자체 또는 메모리 공간을 식별하기 위한 식별자이다.
변수를 생성하는 것은 변수의 선언이라고 한다.
풀어서 설명하자면, 값을 저장하기 위한 메모리 공간을 확보하며, 변수 이름과 확보된 메모리 공간의 주소를 연결해 값을 저장가능하도록 준비하는이다.
let animal; // 변수 선언
animal; // 변수에 값 할당
let fish = 'shark' // 변수 선언과 할당을 동시에
let insect, bug; // , 콤마를 사용하여 두가지 변수를 선언
let insect = 'butterFly' , bug = 'cockroach' // , 사용 => 두가지 변수 값 할당
let animal;
let fish = 'shark'
먼저 var는 ES6 에서 let과 const가 나오기 전에 모든 선언을 담당했던 키워드였다. 그런데 왜 let과 const가 나왔을까??
for(var i=0; i<5; i++) {
console.log(i);
} // => 0 1 2 3 4
console.log(i); //=> 5 반복문의 변수에 접근
var는 오로지 ‘함수레벨 스코프'이기 때문이다. ( ⇒ 함수의 코드 블록 범위 까지만을 스코프로 인정 ) ( 아래의 코드에서 확인 해보자 )
이러한 var변수의 스코프를 제한하기 위한 방법으로는 즉시 실행 함수를 사용하는 방법이 있다.
function test() {
for (var i = 0; i < 5; i++) {
continue;
}
console.log(i); //=> 5
}
console.log(i); // 참조오류 : i는 정의되지 않았습니다.
var는 오로지 ‘함수레벨 스코프' 이것을 기억하자!
재선언, 재할당이 가능하다.
var animal = 'dog';
console.log(animal); // => dog
var animal = 'cat';
console.log(animal); // => cat
변수 호이스팅이 이루어진다.
console.log(animal); // => undefined;
console.log(bird); // => ReferenceError: Cannot access 'bird' before initialization
console.log(ant); // => ReferenceError: Cannot access 'bird' before initialization
var fish = "shark";
var animal = "dog";
let bird = "eagle";
const insect = "ant";
console.log(animail); // => undefined
var animal = 'dog';
-----------------------------------------------------------------
var animal; // var animal = undefined; 한것과 같음.
console.log(animal); // => undefined;
animal = 'dog';
// var로 선언한 변수는 호이스팅이 된 후에 undefined가 할당된다. 실제 값은 상단에서
// 정의했던 그 위치에서 할당이 되기에 undefined를 출력한다.
-----------------------------------------------------------------
console.log(animal); //=> undefined
animal = 'dog';
console.log(animal); //=> dog
var animal = 'cat';
// 이렇게 문제 많아보이는 코드도 에러없이 실행이 된다.
var 변수를 함수에서 키워드 없이 값을 할당하면 전역 변수가 된다.
function test1() {
i = 1;
}
function test2() {
console.log( i );
}
test2(); // => 1
“ 스코프 안에 있는 모든 선언들을 적용된 스코프의 최상위로 끌어올리는 것”
변수 생성과정을 보면서 var , let , const 의 호이스팅을 알아보자.
console.log(animal); // => undefined
var animal = 'dog';
var animal;
console.log(animal); // => undefined;
animal = 'dog';
1 )
console.log(animal);//=>RefError:Cannot access 'animal' before initialization
let animal = 'dog' || const animal = 'dog'
2 )
animal = 'dog'//=>RefError:Cannot access 'animal' before initialization
let animal = 'cat' || const animal = 'dog'
let animal = ‘cat’
에 has already already declared
오류가 발생했을것이다!!3 )
function animal() {
return name;
}
let name = 'dog'; || const animal = 'dog'
console.log(animal()) //=> dog;
ES6에서 부터 나왔다.
let, const 는 블록레벨 스코프!
let animal = 'eagle';
animal = 'dog';
console.log(animal); // => dog
const animal = ['dog'];
animal.push('cat');
console.log(animal);