html

24.07.03> this, dom

연습노트 2024. 7. 3. 17:20


 요약 및 정리

이 문서는 JavaScript의 `this` 키워드에 대해 설명하는 내용을 포함하고 있습니다. `this` 키워드의 정의, 특징, 그리고 다양한 사용 사례를 다루고 있습니다. 주요 내용은 다음과 같습니다:

 1. `this`란 무엇인가?

- 정의:
  - `this`는 객체를 가리키는 참조 변수입니다.
  - `this`는 호출되는 위치에 따라 다른 값을 출력하기 때문에 혼란을 줄 수 있습니다.

- 기본 원칙:
  - 메서드로 호출하면 `this`는 그 메서드가 속한 객체를 가리킵니다.
  - 단독 함수 호출 시, `this`는 전역 객체(window, node는 global)를 가리킵니다.
  - 화살표 함수의 경우, `this`는 화살표 함수가 선언된 상위 스코프를 가리킵니다.
  - 생성자 함수 또는 클래스의 경우, `this`는 생성된 인스턴스를 가리킵니다.

 2. `this`의 특징

- 실행 시점에 결정:
  - `this`는 함수가 만들어질 때가 아닌 '실행'될 때 그 값이 결정됩니다.
  - 이는 함수가 호출되는 문맥에 따라 `this`의 값이 달라진다는 의미입니다.

 3. `this`의 다양한 사례

 메서드로 호출한 경우

- 설명:
  - 객체의 메서드로 함수를 호출하면 `this`는 그 메서드가 속한 객체를 가리킵니다.
  
- 예제:

  ```javascript
  let myObj = {
      val1: 100,
      func1: function () {
          console.log(this); // `this`는 myObj를 가리킴
      }
  };

  myObj.func1(); // myObj를 가리킴
  ```

 함수로 호출한 경우

- 설명:
  - 단독으로 함수를 호출하면 `this`는 전역 객체(window, node는 global)를 가리킵니다.
  
- 예제:

  ```javascript
  function a() {
      console.log(this); // `this`는 window (전역 객체)를 가리킴
  }

  a(); // window (전역 객체)를 가리킴
  ```

 화살표 함수의 경우

- 설명:
  - 화살표 함수는 `this`를 정의하지 않으며, 상위 스코프의 `this`를 가리킵니다.
  
- 예제:

  ```javascript
  let obj = {
      count: 10,
      func: () => {
          console.log(this.count); // `this`는 상위 스코프를 가리킴
      }
  };

  obj.func(); // undefined (상위 스코프를 가리킴)
  ```

 생성자 함수 또는 클래스의 경우

- 설명:
  - 생성자 함수나 클래스를 통해 객체를 생성할 때, `this`는 생성된 인스턴스를 가리킵니다.
  
- 예제:

  ```javascript
  function Person(name) {
      this.name = name; // `this`는 생성된 인스턴스를 가리킴
  }

  let john = new Person('John');
  console.log(john.name); // John
  ```

 4. HTML과의 상호작용 예제

 설명

- HTML 문서에서 버튼을 클릭할 때 `this`가 어떻게 다르게 동작하는지 보여줍니다.
- `button1`은 `myObj.func1`을 이벤트 핸들러로 사용하고, `button2`는 `test` 변수를 이벤트 핸들러로 사용합니다. 이로 인해 `this`의 값이 달라집니다.

 예제

```html
<!DOCTYPE html>
<html lang="ko">
<head>
    <title></title>
</head>
<body>
    <button id="btn1">클릭해봐요!</button>
    <button id="btn2">클릭해봐요!</button>
    <script>
        let myObj = {
            val1: 100,
            func1: function () {
                console.log(this); // `this`는 버튼을 가리킴
            },
        };
        let test = myObj.func1;
        let button1 = document.getElementById("btn1");
        button1.addEventListener("click", myObj.func1); // myObj.func1의 `this`는 버튼을 가리킴
        let button2 = document.getElementById("btn2");
        button2.addEventListener("click", test); // `this`는 상위 스코프의 `this`를 가리킴
    </script>
</body>
</html>
```

 5. 다양한 상황에서의 `this` 값

 설명

- 함수 호출 방식에 따라 `this`가 가리키는 대상이 어떻게 달라지는지 보여줍니다.

 예제

- 전역 호출: `this`는 전역 객체(window)를 가리킴

  ```javascript
  function sayName(){
    console.log(this.name);
  }

  var name = 'Hero'; 
  sayName(); // 'Hero'
  ```

- 객체 메서드 호출: `this`는 해당 객체를 가리킴

  ```javascript
  let peter = {
    name: 'Peter Parker',
    sayName: sayName
  }

  let bruce = {
    name: 'Bruce Wayne',
    sayName: sayName
  }

  peter.sayName(); // 'Peter Parker'
  bruce.sayName(); // 'Bruce Wayne'
  ```

- 생성자 함수 호출: `this`는 생성된 인스턴스를 가리킴

  ```javascript
  function Person(name) {
    this.name = name;
  }

  let john = new Person('John');
  console.log(john.name); // John
  ```

- 화살표 함수 호출: `this`는 상위 스코프를 가리킴

  ```javascript
  let obj = {
    count: 10,
    func: () => {
      console.log(this.count); // undefined
    }
  }

  obj.func(); // undefined
  ```
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 DOM(Document Object Model)이란?

DOM(Document Object Model)은 HTML, XML 문서의 구조화된 표현을 나타내며, 프로그래밍 언어가 문서의 구조, 스타일, 내용에 접근하고 변경할 수 있도록 하는 인터페이스입니다. DOM은 문서를 계층적인 트리 구조로 표현하며, 각 요소를 객체로 나타냅니다. 이를 통해 프로그래머는 자바스크립트를 사용하여 웹 페이지의 콘텐츠와 구조를 동적으로 변경할 수 있습니다.

 DOM 구조

1. 문서(Document): 최상위 객체로, 전체 HTML 또는 XML 문서를 나타냅니다.
2. 요소(Element): HTML 태그를 나타내며, 요소는 다른 요소를 자식으로 가질 수 있습니다.
3. 속성(Attribute): 요소의 속성으로, 태그의 추가 정보를 제공합니다.
4. 텍스트(Text): 요소 내의 텍스트를 나타냅니다.

 DOM 이벤트와 이벤트 제어

DOM 이벤트는 사용자가 웹 페이지에서 상호작용할 때 발생하는 사건을 나타냅니다. 이벤트는 사용자 입력(클릭, 키보드 입력 등) 또는 프로그램적 변화에 의해 발생할 수 있습니다.

 주요 이벤트 제어 명령어

1. 이벤트 리스너 추가

   `addEventListener` 메서드를 사용하여 요소에 이벤트 리스너를 추가할 수 있습니다.

   ```javascript
   element.addEventListener(event, function, useCapture);
   ```

   - `event`: 이벤트 유형(예: 'click', 'mouseover')
   - `function`: 이벤트가 발생했을 때 호출할 함수
   - `useCapture`: 이벤트 캡처링을 사용할지 여부(옵션, 기본값은 `false`)

   예제:

   ```javascript
   document.getElementById("myButton").addEventListener("click", function() {
       alert("버튼이 클릭되었습니다!");
   });
   ```

2. 이벤트 리스너 제거

   `removeEventListener` 메서드를 사용하여 요소에서 이벤트 리스너를 제거할 수 있습니다.

   ```javascript
   element.removeEventListener(event, function, useCapture);
   ```

   예제:

   ```javascript
   function handleClick() {
       alert("버튼이 클릭되었습니다!");
   }

   let button = document.getElementById("myButton");
   button.addEventListener("click", handleClick);

   // 나중에 이벤트 리스너 제거
   button.removeEventListener("click", handleClick);
   ```

3. 이벤트 객체 사용

   이벤트 리스너 함수는 이벤트 객체를 매개변수로 받을 수 있으며, 이를 통해 이벤트에 대한 자세한 정보를 얻을 수 있습니다.

   ```javascript
   document.getElementById("myButton").addEventListener("click", function(event) {
       console.log("이벤트 유형:", event.type);
       console.log("이벤트 대상:", event.target);
   });
   ```

4. 기본 이벤트 동작 방지

   `preventDefault` 메서드를 사용하여 기본 이벤트 동작(예: 링크 클릭 시 페이지 이동)을 방지할 수 있습니다.

   ```javascript
   document.getElementById("myLink").addEventListener("click", function(event) {
       event.preventDefault();
       alert("기본 링크 동작이 방지되었습니다.");
   });
   ```

5. 이벤트 전파 중단

   `stopPropagation` 메서드를 사용하여 이벤트가 더 이상 상위 요소로 전파되지 않도록 할 수 있습니다.

   ```javascript
   document.getElementById("myButton").addEventListener("click", function(event) {
       event.stopPropagation();
       alert("이벤트 전파가 중단되었습니다.");
   });
   ```

 예제 코드

```html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>DOM 이벤트 예제</title>
</head>
<body>
    <button id="myButton">클릭하세요!</button>
    <a href="https://example.com" id="myLink">이동</a>

    <script>
        document.getElementById("myButton").addEventListener("click", function(event) {
            alert("버튼이 클릭되었습니다!");
        });

        document.getElementById("myLink").addEventListener("click", function(event) {
            event.preventDefault();
            alert("기본 링크 동작이 방지되었습니다.");
        });
    </script>
</body>
</html>
```

 요약

- DOM: HTML, XML 문서의 구조화된 표현으로, 문서를 트리 구조로 표현하여 프로그래밍 언어가 문서의 구조, 스타일, 내용을 변경할 수 있도록 합니다.
- 이벤트: 사용자 입력 또는 프로그램적 변화에 의해 발생하는 사건입니다.
- 이벤트 제어: `addEventListener`, `removeEventListener`를 사용하여 이벤트를 제어하며, `preventDefault`, `stopPropagation`을 통해 기본 동작을 방지하거나 이벤트 전파를 중단할 수 있습니다.