DOM이란?

Document Object Model의 약자이다.

HTML 엘리먼트들을 자바스크립트로 자바스크립트 객체처럼 조작 할 수 있는 개념이다.

 

<script src="script.js"></script>

 

위 처럼 자바스크립트 파일을 불러오는 구문을 HTML문서내에 추가하여 실행할 수 있다.

script.js 파일 내에 기술된 자바스크립트 명령어로 HTML문서 내 요소를 제어하는 것이다.

 

위 구문을 집어넣을 때는 HTML내의 <head></head> 내부나 아니면 </body>의 직전에 추가한다.

그 이유는 자바스크립트 파일은 불러들이는 즉시 실행되며, HTML문서는 위에서부터 아래로 내려가며 실행되기 때문이다.

 

 

예를 들어 script.js 파일을 이렇게 작성하였다고 하자.

script.js 파일  - [소스 0]

이 파일을 <head></head>내부에서 불러오면, 2번째 콘솔로그는 제대로 출력되지 않는다.

1) <head></head> 안에 넣기  - [소스 1]

결과 : 

2번째 콘솔이 제대로 실행되지 않았다.

불러와야 할 #msg요소가 등장하기 이전에 자바스크립트가 먼저 실행되버리기 때문이다.

자바스크립트가 실행되는 시점에는 아직 #msg요소가 없다.

 

그래서 위같은 경우는 이렇게 짜야 한다.

2) </body> 직전에 넣기  - [소스 2]

이렇게 <body>태그가 끝나기 직전에 자바스크립트 호출을 넣는다면 두번째 console.log까지 제대로 출력된다.

결과 : 

2번째 콘솔이 제대로 실행되고 있다.

 

그러므로 코드에 따라 적절하게,

1) <head></head>안에 넣던지,

2) <body></body> 마지막에 추가하도록 해야 한다.

 

 

 

[소스 0] script.js 파일

console.log('Hello World!'); //1번째 콘솔로그

let msgElement = document.querySelector('#msg');
console.log(msgElement); //2번째 콘솔로그

 

[소스 1] <head></head> 내에 추가

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <!-- script 요소 삽입 위치 -->
    <script src="script.js"></script>
  </head>
  <body>
    <div id="msg">Welcome~!</div>
  </body>
</html>

 

[소스 2] <body></body> 마지막에 추가

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>

  <body>
    <div id="msg">Welcome!</div>
    <!-- script 요소 삽입 위치 -->
    <script src="script.js"></script>
  </body>
</html>

 

이 이미지는 본문의 내용과 전혀 상관없습니다. 코딩하다 눈이 아프면 한번씩 보기 위해 넣습니다.

위 사진은 본문의 내용과 아무 상관 없습니다. 단지 눈이 좀 편하고 싶어서 퍼왔음.

 

 

scope란? 변수의 유효범위를 말한다.

유효범위가 무엇일까? 바로 변수가 영향력을 발휘할 수 있는 지역이다.

이 지역 밖에서는 그 변수는 없는 것이나 마찬가지이다.

즉, 변수는 자기 scope 안에서만 유효하다.

 

아래 예시를 보면 함수 밖에도 strawBerry 변수가 선언되고 있고 함수 안에도 strawBerry 변수가 선언되고 있다. 구분을 위해 색깔을 달리 입혀보았다.

둘다 똑같은 이름 strawBerry 이다. But, 둘은 서로 다른 변수이다.

 

그것을 어떻게 알 수 있는가?

 

사실 const는 변수 선언, 할당이 단 한번밖에 허용되지 않는다.

만약 const로 똑같은 변수를 한번 더 선언, 할당한다면 Uncaught SyntaxError: Identifier 'strawBerry' has already been declared 라는 에러메세지가 뜬다. 즉, 이미 선언된 변수니까 다시 선언하지 말라는 거다.

그런데 아래 코드를 실행하면 그런 에러가 뜨지 않는다.

둘은 서로 다른 변수이기 때문이다.

왜 똑같은 strawBerry 라는 이름을 사용하는데 서로 다른 변수라는 것일까?

위에서 말한대로, 둘은 서로 다른 지역(범위 = scope)를 갖고 있다.

 

1번 줄의 '스트로베리' 변수와 4번 줄의 '스트로베리' 변수는 서로 다른 변수이다.

 

 

<복사 & 붙여넣기를 위한 코드>;

const strawBerry = 1;

function test () {
  const strawBerry = 0;    // 여기서의 strawBerry 변수는 함수 밖의 strawBerry 변수와 서로 다른 변수임.
  console.log(strawBerry);
}

test();    // 0
console.log(strawBerry);    // 1

 

 

 

위 코드를 실행해보자.

 

그럼 이렇게 된다.

위 코드의 실행결과를 보면 유효범위(scope)가 다른 변수의 생태를 더 확연히 알 수 있다.

 

크롬 브라우저 콘솔창에서 실행한 결과, 함수 안에서 선언 할당된 strawBerry변수는 0, 함수 밖에서 선언 할당된 strawBerry변수는 1을 값으로 가지고 있다.

즉 서로 유효범위가 다른 변수들끼리는 서로 터치하지 않는다. 각각 독립된 구역을 차지하고 있다.

하나는 함수 밖 땅을 차지하고 있고 하나는 함수 안 땅을 차지하고 있다.

이것이 scope이다. 변수의 유효범위. 변수가 차지하는 구역.

 

 

# (내가) 알기 쉽게 설명하는 게 목표입니다. 그래서 변수명도 내맘대로 설명도 내가 생각하는대로 임.

+ Recent posts