Programming/Client

[Javascript] 모듈로 설정된 파일의 변수는 전역 변수가 아니다!

Jiwoo 2023. 1. 6. 12:13

🤔 문제

바닐라 자바스크립트로 프로젝트를 진행하던 중

html에 자바스크립트 파일을 연결하던 부분을 변경하게 되었다.

단순히 타입을 모듈로 변경한 것이었다.

<script type="module" src="app.js" defer></script>

그런데 이렇게 타입을 지정하니까

js 파일에서 삽입한 코드의 이벤트 함수를 인식하지 못했다.

버튼을 눌러도 아무런 반응이 없었다.

// box 안에 버튼 넣어주기
const  box = document.querySelector(".box");
box.innerHTML = `
    <button onClick="handleClick()">Click!</button>
`;

// 버튼의 이벤트 함수
const handleClick = () => {
  console.log("hi");
};

🔑 해결

이 문제는 전역에서 해당 handleClick 함수를 찾지 못해 생기는 것이었다.

타입을 모듈로 지정하면 해당 파일만의 스코프가 만들어진다.

그러므로 모듈로 지정하기 전에는

handleClick === window.handleClick

이었다면 모듈로 지정한 후에는 아닌 것이다.

해결 방법은 두 가지가 있다.

1. 이벤트 함수를 전역 함수로 선언하기

window.handleClick = () => {
  console.log("hi");
};

2. 해당 버튼을 찾아 이벤트리스너로 이벤트 함수 부여하기

const button = box.querySelector("button");

button.addEventListener("click", () => {
  alert("hi");
});

역시 전자가 훨씬 간편하다.
앞으로 유의해서 코드를 짜야겠다.