강의 | Chap 15 JS 시작하기

#9. 변수 유효범위

먼저 undefined와 reference error의 차이를 알아보자.


1. 변수가 선언되었으나 어떤 값도 할당되지 않았을 경우 undefined 이다.
2. 변수/함수가 정의내려지지 않은 상태에서 사용하려 하면 reference error 가 반환된다.

결국 선언되긴 했는데 값이 없을 경우 undefined,
선언도 하지 않고 (정말 아무것도 없는데) 무작정 쓰면 ref. error인 듯 하다.

위 이미지 출처: https://stackoverflow.com/questions/35799283/what-is-the-difference-between-uncaught-referenceerror-and-undefined

1. const / let 의 유효범위

1) 변수는 선언된 블럭 내에서만 유효하다.


얼핏보면 작동할 것 같은 함수이지만,
이렇게 쓸 경우 console에는 reference error 메세지가 출력된다. (a is not defined)
a라는 변수는 선언된 블럭(아래 영역) 내에서만 유효하기 때문이다.

if (true) { // 여기서부터
  const a = 123
} // 여기까지.

하여, 아래와 같이 고쳐야 작동한다.

function scope() {
  if (true) {
  	const a = 123
  	console.log(a) //console.log(a)가 if 문 안, const ~ 아래로 들어왔다.
  }
}
scope()

2) 선언된 블럭 내에서 const 이전에 위치할 경우

function scope() {
  if (true) {
    console.log(a) //console.log(a)가 const 위에 위치해있다.
  	const a = 123
  }
}
scope()

console.log(a)const a = 123 보다 먼저 읽히는 구조이다.
즉 console.log 시점에는 a가 선언되지 않았다. 그렇지만 구조상 같은 블럭 내에 있다.
(= 같은 블럭 내 선언되었음은 확인 가능하나, 값은 확인할 수 없다.)
그러므로 console 창에는 undefined가 출력된다.

3) 선언된 블럭 위에 위치할 경우

function scope() {
  console.log(a) //console.log(a)가 if문 전에 적혀있다.
  if (true) {
  	const a = 123
  }
}
scope()

위와 비슷해보이지만 결과는 다르다.
console.log(a)가 if문 전에 위치하여 a가 선언된 범위 밖에 있으므로,
reference error가 뜨게 된다.

2. var 의 유효범위

1) var는 함수 레벨 범위내 유효하다.

= 메모리 누수로 이어질 수 있음.

function scope() {
  if (true) {
    var a= 123
    console.log(a)
  }
}
scope()

console 창에서 123이 출력된다.

2) 선언된 블럭 내에서 const 이전에 위치할 경우

function scope() {
  if (true) {
    console.log(a)
    var a= 123
  }
}
scope()

1.의 2)와 같이 undefined. (=선언되긴 했는데 값이 없을 경우)

3) 선언된 블럭 위에 위치할 경우

function scope() {
  console.log(a)
  if (true) {
    var a= 123
  }
}
scope()

위의 경우는 1.의 3)에서 const를 var로 바꾼 것이다.
여기는 reference error가 아닌 undefined가 출력된다.
var는 함수 범위내 유효하다는 첨 다시 참고.

#10. 형 변환 (Type Conversion)

1) == 동등연산자.

위를 사용하게 되면 1과 '1'이 같다고 하기 때문에,
의도치 않게 서로 다른 값이 동일(===)하다고 생각할 수 있음.
(값은 같음. 다만 하나는 문자데이터고 한쪽은 숫자데이터라 다름.)
그러므로 JS 에서는 동등연산자는 피해야.

2) Truthy vs Falsy


truthy: 참 같은 값 (매우 다양한 케이스)
falsy: 거짓 같은 값 (한정적인 케이스)

  • 참고로 NaN(Not a Number)은 숫자 데이터이다.
profile
프론트엔드 개발 입문자입니다. 오타, 틀린 내용 피드백 환영합니다.

0개의 댓글