javaScript/error

js // reference error (참조오류)

부엉이사장 2023. 5. 2. 04:44

# MDN정의

- ReferenceError 객체는 현재 범위에서 존재하지 않거나 초기화되지 않은 변수를 참조했을 때 발생하는 에러를 나타냅니다.

 

 

 

# 일반적인 참조오류

console.log(babo);

코드에서 babo를 선언하지 않았는데 참조하려고할때 뜬다.

 

+ 초기화안된 변수 참조할때

console.log(babo);
let babo;

초기화 호이스팅 포스팅 참조

https://jacobowl.tistory.com/136

 

변수 호이스팅, 그리고 초기화 initialize, Temporal Dead Zone

초기화는 변수선언시에 최초로 undefined가 할당이 되는것을 말한다. 먼저 그림으로 살펴보면, let value = 'hello world'; 라는 코드가 실행되면 먼저 식별자 value가 가르키는 메모리주소1이 생성되고 이

jacobowl.tistory.com

 

 

 

 

# 흔히 실수먹는 경우(객체 프로퍼티 참조)

const obj = { key1: 1, key2: 2, key3: 3 };
console.log(obj.key1); //1

이런 객체 프로퍼티에 참조하려고 할때

key1프로퍼티 키에 접근하려고하면 당연히 1을 잘 가져온다.

 

그렇다면 없는 키값에 접근할때는 어떻게 될까? 참조에러가 뜰까?

const obj = { key1: 1, key2: 2, key3: 3 };
console.log(obj.key4); //undefined

없는 키값 key4에 접근하려 하면 undefined가 뜬다.

참조에러가 뜨는게 아니라 에러없이 undefined가 뜬다는거다.

 

즉 객체안에서 없는 프로퍼티에 접근하려하면 undefined로 뜬다.

참조코드와 동시에 객체내부에서 선언이되는건지 아닌건지 모르겠지만 이렇게 되는게

실제 코드를 써보면 더 편리하다.

 

+이중 객체에서의 참조

const obj = { key1: 1, key2: 2, key3: 3 };
console.log(obj.key4.secondKey);

위 obj에서 key4값은 undefined일것이다.

근데 이 key4가 객체라고 생각해서 그 안의 secondKey프로퍼티에 접근하려고하면

참조에러가 아닌 타입에러가 뜬다. 이땐 옵셔널체이닝써라.

const obj = { key1: 1, key2: 2, key3: 3 };
console.log(obj.key4?.secondKey);

이게 옵셔널 체이닝..

실제 서버에서 json형식으로 데이터를 주고받는데 필요없는 프로퍼티를 서버백단에서

다 추가해서 보내야하는 불필요함이 없어진다. 

 

얕은 객체참조에선 그냥 undefined가 떠야 수월하고 깊은 객체참조에선 옵셔널체이닝을 사용하여 참조하는게

좋다는 말임.. 

 

참조에러 설명하다가 별걸 다쓴다.

 

 

 

# 스트릭모드에서 변수선언문없이 변수할당했을때

"use strict";
value = "바보";

# 화살표함수에서 없는 arguments, caller프로퍼티 참조하려고할때

const fucArguments_arrow = () => {
  console.log(arguments);
};

fucArguments_arrow(); // 브라우저에선 참조에러 arguments가 정의안되었음. 노드에선 전역 arguments 참조

브라우저에서 에러

노드에선 모듈시스템이라 스코프체인을 따라 전역 arguments객체를 참조해서 에러안뜸

caller프로퍼티도 마찬가지