Skip to main content

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

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

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

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를 맞이하게 된다.