1장 블록바인딩

var 선언과 호이스팅

var를 이용하여 변수를 선언하면 선언한 위치와 상관없이 함수의 맨 위에 있는것처럼 선언된다 >> 호이스팅

function getValue(isTrue) {
	if(isTrue) {
    		var value = 'blue';
            	return value;
        }
        else {
        	return null;
        }
        

위 코드에서 변수 value는 isTrue가 true일때만 선언된다고 생각하지만 조건의 참/거짓 여부에 상관없이 생성된다.

function getValue(isTrue) {
	var value;
    
    if(isTrue) {
    	value = 'blue';
        return value;
    } else {
    	return null;
    }

자바스크립트 엔진은 내부적으로 위 코드처럼 변경한다.

value변수의 초기화를 실핸하는 코드는 같은 지점에 남아있고, value 선언은 맨 위로 호이스팅 된다.
만약 else문에서 value값에 접근하면 초기화 되어있지않으므로 undefined값을 가진다.

블록-레벨 선언

주어진 블록 스코프 밖에서는 접근할 수 없는 바인딩을 선언하는 것

let선언 (지역변수 같은 느낌)

let선언은 선언된 블록의 맨 위로 호이스팅되지 않기 때문에, 전체 블록에서 사용할 수 있도록 블록의 첫 부분에 두는 것이 가장 좋음

function getValue(isTrue) {
    if(isTrue) {
        let value = 'blue';
        return value;
    }else {
        // value는 여기에 존재 ㄴㄴ
        return null;
    }
    // value는 여기에 존재 ㄴㄴ
}

식별자가 특정 스코프 안에 선언되어 있을 경우, 스코프 안에서 let선언으로 재정의 하면 에러 발생

var cnt = 1;
// 1. 에러 발생
let cnt = 0; 

// 2. 새 블록 스코프안에 선언 시, 에러 ㄴㄴ
if(isTrue) {
	let cnt = 0;
}

const 선언

상수로 간주되며, 한번 설정하면 변경할 수 없다.
선언과 동시에 초기화 해줘야 함

반복문에서 var선언과 let선언

for(var i=0; i<10; i++) {}
console.log(i); // i는 스코프 밖에서도 존재하므로 10 출력

for(let i=0; i<10; i++) {}
console.log(i); // i는 스코프 밖에서 존재하지않으므로 출력XX

좋은 웹페이지 즐겨찾기