JavaScript

[자바스크립트] 스코프 체인 알아보기

paintover23 2023. 8. 9. 15:46
728x90

// 스코프 체인: 함수에서 어떤 값에 접근이 가능하고 불가한 지 범위
// 라이브러리나 내장함수는 아래와 같이 생각하면 된다

const console = {
  log() {
    // 콘솔에 글자 적는 기능
  },
};

const x = 'hello';

function c() {
  const y = 'y';
  console.log('c');
  function b() {
    // 2. 여기 b 선언 실행 부분으로 바로 갈 수 있는 것이 아니다. 
    // (uncaught referenceError: b is not defined 발생) 안 되는 경우는 스코프 분석해야 한다. 
    const z = 'z';
    console.log('b');
    c();
  }
}


function a() {
  const x = 'bye'; // 스코프가 다르기 때문에 문제가 안됨
  console.log('a');
  console.log(x)
  b(); // 1. 앞의 호출스택에서 배운 것처럼 b() 호출하면, 
}

a();
c();

[스코프 판단하는 방법 - 함수의 '선언'을 기준으로 보자 (에디터 접어서 확인)]

  function c() {}
    function b() {}
  function a() {}

 

[lexical scope]

  c --> anonymous (anonymous는 전체 코드에 대한 함수라고 생각하면 된다, 화살표는 포함하고 있는 더 큰 함수를 뜻함. anonymous함수 안에 함수 c가 있다)

  a --> anonymous 

  b --> c --> anonymous (함수 b는 함수 c에 포함되고, 함수 c는 anonymous에 포함)

  

  [선언을 기준으로 확인해보자]

  # a 함수안에서 b 접근 불가 (최상위 함수만 남기고 접어서 확인) 위의 레퍼런스 에러: b is not defined

  # b 함수에서 a 접근 가능

    1. b함수 안에서 a 선언 없음 

    2. 그 다음 부모인 c 안에서 a 선언 없음

    3. 그 다음 부모인 anonymous 안에 a 선언 있음

 

[헷갈릴 때는 선언지도를 그려보자]

  anonymous <-- x, c, a

  c <-- y, b

  b <-- z

  a <-- x (1console.log(x)하면 따라서 bye가 출력된다. a함수에서 x에 접근할 수 있기 떄문.)

 

  a --> anonymous(만약 a 함수안에서 x를 못 찾으면, a의 부모인 anonymous안에서 찾고 그 결과 hello 출력된다.)

 따라서  똑같은 변수가 있으면 먼저 찾는 것이 우선으로 찾아진다.

 

 

 

참고자료: https://www.youtube.com/watch?v=0lF2zaQ31Ek&list=PLcqDmjxt30Rt9wmSlw1u6sBYr-aZmpNB3&index=5 

728x90
반응형