2016-10-25 3 views
7

나는 fooModule이라는 모듈을 가지고 있습니다. 이 모듈의 내부에서, 나는 가져 fooModule (자체) :es6 모듈은 어떻게 자체적으로 가져올 수 있습니까?

import * as fooModule from './fooModule'; 

export function logFoo() { 
    console.log(fooModule) 
} 

logFoo()가 호출 될 때, 나는 fooModule의 수출을 모두 볼 수 있습니다. 어떻게 작동합니까?

+1

무엇을하고 싶은가요? – anshuVersatile

+6

수입품은 필수적이지 않으며 해결책과 실행은 분리되어 있습니다. 가져 오기가 먼저 구문 분석되고 해결됩니다. 코드가 실행될 때까지 모든 바인딩이 이미 해결됩니다. – Joseph

+2

가장 좋은 방법은 이것을하지 않는 것입니다. –

답변

8

선언적 가져 오기/내보내기에는 순환 종속성 문제가 없습니다. :-)

이 솔루션은 import 변수에 값을 가져 오지 않는다는 것입니다,하지만 변수 보낸 변수에 참조 수 있다고하지만 귀하의 경우에는, 원은 최소한의 길이입니다. 가변 변수의 예를 보려면 here을, 정확한 용어는 this question을보십시오.
모듈 네임 스페이스 개체의 경우도 마찬가지입니다. 속성은 실제 내 보낸 변수를 확인하는 getter입니다. 모듈로드 및 평가 될 때

그래서, 다음 단계가 발생합니다

  1. 소스 정적 모듈 범위가 생성 종속성 그래프
  2. 을 구축 exportimport 선언에 대한 분석
  3. 모듈의 유일한 의존성은 이미 초기화되어 있으므로 초기화 할 때까지 기다릴 필요가 없습니다.
  4. fooModule 변수가 만들어지고 인스턴스화됩니다. 내 보낸 모듈 이름을 가진 객체이며, ["logFoo"]으로 알려져 있습니다. fooModule.logFoo 속성은 모듈 범위의 변수 logFoo으로 평가되는 게터가됩니다 (export {A as B}을 사용한 경우 fooModule.BA으로 해결되지만 두 경우 모두 동일한 이름 임).
  5. 모듈 범위의 변수 선언
  6. 이 경우 logFoo에서 변수를 생성하고 함수 선언은 모듈의 코드가 실행될
  7. (즉 logFoo 할당됩니다 기능) 초기화된다
  8. 를 (귀하의 경우 아무 일도 발생하지 않습니다)

logFoo을 가져 오는 모듈에서 호출하면 fooModulelogFoo을 포함하는 네임 스페이스를 참조합니다. 마법 없음 :-)

+0

나는 SO에 넣은 시간을 늘 감사하지만,이 동작에 대한 유스 케이스를 이해하지 못하고있다. 위에 언급했듯이 중복 코드를 피하기 위해 사용할 수 있습니다. 그러나 의미 론적으로는 언제 어떤 것이 자체에 의존하는 것이 맞습니까? – aaaaaa

+1

@aaaaaa 자신의 모듈 네임 스페이스 객체 (동적 속성 액세스, 기본 내보내기 등)를 얻고 수동으로 그러한 객체를 생성하지 않고 자신의 [익명 기본 내보내기]에 액세스하는 두 가지 유스 케이스 만 생각할 수 있습니다. (http : // stackoverflow.co.kr/a/35225936/1048572) (어떤 이유로 이름을 지을 수없는 경우). – Bergi

관련 문제