JavaScript

함수 뒤에 나온 변수를 사용하면 왜 에러가 안날까?

milliwonkim 2023. 3. 28. 19:53
반응형
SMALL

이 글에서 "선언 전"이라는 의미는 단순히 줄의 전 후 관계

 

변수가 글로벌 스코프인 경우

const App = () => {
  return <div style={styles}> </div>
}

const styles = {
  display: 'flex'
}

이 코드는 에러가 안난다.

 

이유는 styles 변수가 이 파일의 글로벌스코프에 있어서, 어디에서든 접근이 가능하다. 

심지어 이렇게 실제로 styles를 사용하는, 그것보다 먼저 선언 및 할당 App 함수에서도 사용 가능하다

 

const와 let은 블록 스코프이지만, 만약 글로벌 스코프에서 정의됐다면 파일 어디에서든지 접근 가능하다.

 

변수가 렉시컬 스코프인 경우

const App = () => {
  const App2 = () => {
    console.log(styles);
    return <div style={styles}></div>;
  };

  const styles = { display: "flex" };

  return <App2 />;
};

변수가 렉시컬 스코프(클로저)에 의해 styles을, styles 변수가 선언전 함수 내에서 사용해도 에러가 발생안한다.

(클로저는 리턴되는게 App2이므로 App2 함수)

 

 

ReferenceError를 발생시키는 경우

const App = () => {
  console.log(styles); // ReferenceError: styles is not defined
  const styles = {
    display: 'flex'
  };
  return <div style={styles}> </div>
};

이 코드는 얘기가 다르다.

클로저도 아닌, 단순히 변수 자체를 선언 전에 사용하려고 했으니 당연히 ReferenceError를 맞이하게 된다.

반응형
LIST