Uncaught TypeError떴다.
defer추가하니깐 됬다.
async, defer속성은 자바스크립트 로드와 실행차이를 보여준다.
<head>
안에 옵션 없는 일반 스크립포함<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="main.js"></script>
</head>
<body>
</body>
</html>
로드순서
HTML 파싱 -> <head>
에서 JS파일 발견 -> HTML 파싱 멈춤 -> JS다운 -> JS실행 -> 다시 HTML파싱
단점
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>
로드순서
BODY태그 끝까지 HTML파싱 -> JS파일 발견 -> JS다운 -> JS실행
장점
단점
<head>
안의 <script async..></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="mainA.js" async></script>
<script src="mainB.js" async></script>
<script src="mainC.js" async></script>
</head>
<body>
</body>
</html>
로드순서
HTML 파싱 -> HTML파싱 멈춤 -> 다시 HTML 파싱
JS파일다운 -> JS파일 실행
위의 방법으로 여러개의 JS파일을 수행 할 경우. 다운은 병렬로 수행되지만. 실행은 다운 완료된 순서대로 실행 되므로 수행의 파악의 어려움이 있다.
장점
단점
<head>
안의 <script defer...></script>
(기본적으로 가장좋은방법)<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="mainA.js" defer></script>
<script src="mainB.js" defer></script>
<script src="mainC.js" defer></script>
</head>
<body>
</body>
</html>
로드순서
HTML 모두다 피싱 -> 다운된 JS파일 실행
JS다운 ->
HTML파싱과 JS다운이 병렬로 수행된다.
위의 방법으로 여러JS파일을 수행 할 경우. 패칭은 병렬로 동시에 일어나고, 실행의 순서는 절차적으로 위에서부터 아래로 수행된다.
장점