- 웹문서 내부에서 스크립트 작성하기
- 웹문서의 html 코드는 일반적으로 위에서 아래로 순서대로 로드되고 실행된다. 따라서, 적용하려는 html 및 Css 코드보다 스크립트가 먼저 불려지면 오류가 발생할 수 있다. 그런 이유로 스크립트 코드는 </body> 직전에 넣어주어야 한다:
<body>
..
<!--
1-1. html 코드 내부에 넣는 스크립트 코드는 이벤트 리스너에서 'DOMContentLoaded' 속성을 사용해주어야 한다
-->
<script>
document.addEventListener("DOMContentLoaded", () => { // DOM이 다 로드된 이후.. ← defer와 같다!
// 스크립트 코드 실행
})
</script>
<!--
1-2. </body> 바로 직전에 넣어준 스크립트 코드는 'DOMContentLoaded'를 사용하지 않아도 defer와 같은 방식으로 작동한다!
-->
<script>
const buttons= document.querySelectorAll("button")
for(const button of buttons) {
button.addEventListener("click", createParagraph);
}
</script>
</body>
☞ 이 경우, 모든 html 코드를 읽어온 이후 스크립트를 불러오게 되지만, 문제는 DOM을 모두 불러오기 전에는 스크립트의 로딩과 분석이 완전히 중단된다는 점이다!
- 외부 스크립트 소스 불러오기
-
외부에서 불러오는 <script>의
src=
속성은 스크립트 코드를 html 문서에서 분리하여 단순화한다는 점 외에도, 단 한번만 불러오면 웹페이지 전체에서 이 코드를 공유할 수 있고, 따라서 서브 페이지들에서도 스크립트를 따로 불러오지 않고 브라우저 캐시에서 가져다 쓸 수 있다는 장점이 있다: -
defer
스크립트는 순서를 유지한 채로 모든 컨텐츠를 다 불러온 이후에 실행된다. 따라서, 다른 스크립트에 의존하거나 DOM 로딩을 필요로 하는 경우에 사용된다 ← 이는 </body> 바로 직전에 스크립트 코드를 넣어주는 경우와 같다! -
async
스크립트는 다운로드가 끝나는 즉시 '비동기적'으로 실행된다. 그 동안 현재 페이지의 문서 분석은 계속 해나가되, 페이지 렌더링은 일시적으로 중단된다 - 따라서, 스크립트를 즉시 실행해야 하고 종속성이 없는 경우에 적합하다!
<!-- 2-1. 외부 스크립트 파일 불러오기: 'defer' 속성 -->
<script src="js/default-js.js" defer></script>
<!-- 2-2. 외부 스크립트 파일 불러오기: 'async' 속성 -->
<script src="js/default-js.js" async></script>
☞
<script>의 src=
속성은 URL 을 값으로 받기에
다른 웹서버에 있는 코드(예건대, 인터넷 광고 등..)도 가져올 수 있으며,
인라인 스크립트 코드에 비해 웹 페이지 분석 및 렌더링 속도도 더 빠르다!
async
와 defer
는 모두 브라우저가 페이지의 다른 내용을 불러오는 동안
스크립트를 별도 쓰레드에서 불러오므로 스크립트를 가져오는 동안에도 페이지 로딩은 중단되지 않는다
- 단, 양자간에는 다음과 같은 차이점이 존재한다(* HTML 명세서 스크립트 로딩 비교표 참조 요):
- 스크립트 코딩 가이드 라인
- 자바 스크립트는 기본적으로 대/소문자를 구분하며, 여러 칸 공백은 하나의 공백 문자로 간주하고 여러 줄 뉴라인이나 캐리지 리턴, 캐리지리턴&라인피드 모두 하나의 줄바꿈으로 간주한다
- ✓ 세미콜론(;)은 하나의 문이 끝났음을 알리는데, 줄바꿈이 있다면; 생략할 수 있다. 자바스크립트가 줄바꿈을 세미콜론으로 취급하는 경우는 묵시적인 세미콜론을 추가하지 않고서는 코드를 분석할 수 없을 때, 곧 줄바꿈 다음에 오는 공백 아닌 문자를 현재 문에 이어진다고 판단할 수 없을 때이다 ← 예컨대, (나 [로 시작하는 문이 이어질 때 세미콜론으로 구분되지 않는다면; 하나의 연결된 문으로 해석될 소지가 있다!
-
✓
매개변수 리스트 다음에 나오는 화살표 함수(=>)는 한 줄에 작성해야 한다.
return 문 다음에 표현식이 붙는 경우도 반드시 한 줄에 작성해야 한다:
return true;
- ✓ 자바스크립트 코드는 (사람이 읽을 수 있는)유니코드 문자셋으로 작성되지만, ASCII 문자만으로 유니코드 문자를 표현하는 이스케이프 시퀀스 또한 사용할 수 있다 ← 이 이스케이프 시퀀스는 주로 문자열 리터럴이나 정규식 리터럴에서 사용된다!
- ✓ 식별자는 상수나 변수, 속성, 함수, 클래스에 쓰인 이름을 말하는데, 알파벳 대/소문자나 _, $로 시작되어야 한다. 이름은 숫자로 시작할 수 없으며, 공백이나 기호 등도 들어갈 수 없다. 또한, 스크립트 자체에서 쓰는 예약어도 이름으로 쓸 수 없다 ← 덧붙여서, 일반적인 변수 이름의 맨 앞에 _은 사용하지 않는 것이 좋다 - 이는 자바스크립트의 코딩 철학에서 특별한 의미를 나타내는 데 사용되므로 코드를 읽을 때 불필요한 혼동을 불러올 수 있다!
a= 1 // 줄바꿈이 있어 세미콜론 생략 가능
b= 10
x= 1; y= 10 // 앞쪽 세미콜론은 생략 불가!
(a, b) => a + b // 화살표 함수(=>)는 앞의 매개변수 리스트와 같은 줄에 작성해야 한다!
return (a + b) // 리턴문(return) 다음에 표현식(a + b)이 붙는 경우는 한 줄로 작성해야 한다!
☞ break 문이나 continue 문 또한 마찬가지이다!
console.log("이스케이프 문자: \u03c0") // π
console.log("웃는 얼굴 이모지: \u{1F600}") // 😀
☞ 이스케이프 시퀀스는 \u로 시작하여 4개의 16진수 숫자를 적거나, 또는 (16비트 이상이 필요한 이모지를 표시하기 위하여)1~6자리의 숫자를 넣어주는 중괄호({}) 문법으로 작성한다
➥ 여러 단어로 이루어진 이름을 지을 때는 보통 camelCase 표기법 및 snake_case 표기법 방식이 사용되는데, 코드 작성 시 (예컨대, 자신만의 사용자정의 변수 이름에는)kebab-case 표기법을 사용하고, (예컨대, 자신만의 사용자정의 함수 이름에는)PascalCase 표기법을 사용하는 식으로 일관성을 유지하는 것도 코드 작성 및 읽기에 도움이 될 수 있다!