밀하우스 마나스톰
GP
밀하우스 마나스톰
전체 방문자
오늘
어제
  • 분류 전체보기 (71)
    • Cocos Creato.. (35)
    • JavaScript 기.. (11)
    • JavaScript 게.. (4)
    • Dev Tool (1)
    • 1인 개발 (19)
      • 개발 환경 (4)
      • 기능 구현 (2)
      • 게임 리소스 (5)
      • 스팀 게임 출시 (4)
      • 좋은 글 스크랩 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 게임 출시
  • 코코스 크리에이터
  • 타입스크립트
  • 스팀
  • Sprite Frame
  • 게임 등록
  • resolution
  • 배열 함수
  • javascript
  • 코코스
  • steam
  • 무료 사운드
  • 해상도
  • 유니티
  • tween
  • 자바스크립트
  • 웹 게임
  • Cocos Creator
  • typescript
  • 절차

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
밀하우스 마나스톰

GP

순환 참조
JavaScript 기본

순환 참조

2022. 10. 25. 19:13

옛날에 C++ 공부할 때 경험했던 순환 참조는 위와 같이 두 개의 헤더 파일이 서로를 include 했을 때 발생하는 문제였다.

 

이런 경우에는 주로 헤더파일 include 없이 참조하려는 클래스를 전방 선언하는 방법으로 해결했다.

 

최근에 타입스크립트에서도 비슷한 문제를 겪게 되었다.

 

 

A-Script.ts

import { B } from "B-Script";
export class A {}
class Main {
    nodeA: A;

    constructor() {
        this.nodeA = new B();
    }
}

 

B-Script.ts

import { A } from "A-Script";
export class B extends A {}

 

이러한 구조에서 컴파일을 하니 코코스 크리에이터 에디터에서 아래와 같은 에러가 출력됐다.

 

load script [B-Script] failed : TypeError: Object prototype may only be an Object or null: undefined

 

 

위 에러는 사실 순환 참조를 정확히 지적하는 에러는 아니다.

 

class Main의 생성자에서 this.nodeA = new B() 부분에서 클래스 B를 참조할 수 없어서 undefined가 할당되었다는 얘기다.

 

이 현상은 자바스크립트가 자체적으로 순환참조를 감지하고서 의도적으로 undefined 객체를 반환한 것이다.

 

 

자바스크립트에서 순환 참조에 대해서 알아보면 꽤나 복잡하지만 간단히 해결방법을 정리하자면

 

export class A {}
class Main {
    nodeA: A;

    constructor() {
        this.nodeA = new B();
    }
}
import { B } from "BScript";

B 클래스 import를 늦추는 것이다.

'JavaScript 기본' 카테고리의 다른 글

Key와 Value 쌍의 컬렉션  (0) 2023.02.27
Call By Sharing  (0) 2022.04.22
함수 리스트 (Delegate)  (0) 2022.04.12
Array 함수 #6. 기타  (0) 2022.03.08
Array 함수 #5. sort  (0) 2022.03.03
    'JavaScript 기본' 카테고리의 다른 글
    • Key와 Value 쌍의 컬렉션
    • Call By Sharing
    • 함수 리스트 (Delegate)
    • Array 함수 #6. 기타
    밀하우스 마나스톰
    밀하우스 마나스톰

    티스토리툴바