TIL 23.10.11

ν™©μ€ν•˜Β·2023λ…„ 10μ›” 11일
0

TIL

λͺ©λ‘ 보기
95/146

πŸ“ŒToday I Learned

JavaScript

ex39_variable

JavaScript Core

λ³€μˆ˜ μ„ μ–Έν•˜κΈ°

  1. var

    • BOM / DOM / ES6
    • function-scoped
    • μ œμ–΄λ¬Έ (μ˜μ—­ 인식 λΆˆκ°€λŠ₯)
    • 쀑볡 μ„ μ–Έ κ°€λŠ₯
    • μƒμˆ˜ μ„ μ–Έ λΆˆκ°€λŠ₯
  2. let

    • ES6(ESCMAScript 2015)
    • block-scoped(ν•¨μˆ˜, μ œμ–΄λ¬Έ)
    • 쀑볡 μ„ μ–Έ λΆˆκ°€λŠ₯
    • λ³€μˆ˜
  3. const
    - ES6(ESCMAScript 2015)
    - block-scoped(ν•¨μˆ˜, μ œμ–΄λ¬Έ)
    - 쀑볡 μ„ μ–Έ λΆˆκ°€λŠ₯
    - μƒμˆ˜(final λ³€μˆ˜)

ex40_hoisting

ν˜Έμ΄μŠ€νŒ…, Hoisting

  • λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…
  • ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…(μ€‘μš”)
  • μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에, λ³€μˆ˜/ν•¨μˆ˜ 선언문을 ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦°λ‹€. > μ½”λ“œ 재배치
function m3() {
    alert(a); //undefined
	var a = 10; // λ³€μˆ˜ μ„ μ–Έλ¬Έ = var a -> 이거만 μž˜λΌμ„œ alert μœ„λ‘œ κ°€μ Έκ°„λ‹€. -> 값이 μ—†λ‹€.
}

//μœ„μ™€ κ°™λ‹€.
function m3() {
	var a;
    alert(a);
    a = 10;
}

λ©΄μ ‘μ—μ„œ λ¬Όμ–΄λ³Έλ‹€.

m2();

function m2() {
	alert("m2");
}

μ΄λ ‡κ²Œ 선언해도 싀행이 λ˜λŠ” μ΄μœ λŠ”?
-> ν˜Έμ΄μŠ€νŒ…μ΄ 됐기 λ•Œλ¬Έμ΄λ‹€.


ex41_object

객체, Object

  • JavaScriptμ—λŠ” ν΄λž˜μŠ€κ°€ μ—†λ‹€. ν•˜μ§€λ§Œ λ‚΄μž₯ 객체λ₯Ό μ œκ³΅ν•œλ‹€.
  1. λ‚΄μž₯ 객체

    • Array, Date, Math, Object λ“±
    • new Array()
    • new Date()
    • Math.λ©”μ†Œλ“œ()
  2. BOM 객체

    • window, document, form, text, button λ“±
  3. DOM 객체

    • element, attribute, text, comment λ“±
  4. μ‚¬μš©μž μ •μ˜ 객체

    • JavaScriptμ—λŠ” ν΄λž˜μŠ€κ°€ μ—†λ‹€. > μ›ν•˜λŠ” ν˜•νƒœμ˜ 객체 생성 λΆˆκ°€λŠ₯ > μ›ν•˜λŠ” ν˜•νƒœμ˜ 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

μ‚¬μš©μž μ •μ˜ 객체

  1. Object λ‚΄μž₯ 객체λ₯Ό μ‚¬μš©
    • const obj1 = new Object();
  1. {} > 객체 λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μ„ μ‚¬μš©
    • const obj2 = {};

JavaScript의 λͺ¨λ“  κ°μ²΄λŠ” ν”„λ‘œνΌν‹°λ₯Ό 자유둭게 μΆ”κ°€/μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€.

JavaScript의 ν”„λ‘œνΌν‹° ν‘œκΈ°λ²•

  1. hong.tel > 멀버 보톡 μ‚¬μš©
  2. hont['tel'] > key

JavaScript 객체 λ§Œλ“€κΈ°

  1. 빈 객체λ₯Ό λ§Œλ“ λ‹€.
    • new Object()
  2. μ›ν•˜λŠ” ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•œλ‹€.
    • obj.name=''
const lee = new Object();
lee.name = "μ΄μˆœμ‹ ";
lee.age = 25;
lee.addres = "μ„œμšΈμ‹œ 강동ꡬ 풍납동";

const park = {
  name: "λ°•λ¬Έμˆ˜",
  age: 40,
  address: "ν•œμ–‘",
};

//----------------------------------
const address = {
  si: "μ„œμšΈμ‹œ",
  gu: "강남ꡬ",
  dong: "λŒ€μΉ˜λ™",
};

const you = {
  name: "μœ μž¬μ„",
  age: 30,
  address: address,
};

// μœ„μ™€ κ°™λ‹€.
const you = {
  name: "μœ μž¬μ„",
  age: 30,
  address: (address = {
    si: "μ„œμšΈμ‹œ",
    gu: "강남ꡬ",
    dong: "λŒ€μΉ˜λ™",
  }),
};

// 객체에 λ©”μ†Œλ“œλ„ 넣을 수 μžˆλ‹€.
const yang = {
  name: "μ–‘μ„Έμ°¬",
  age: 25,
  hello: m1,
};

function m1() {
  alert("μ•ˆλ…•ν•˜μ„Έμš”.");
}

yang.hello();

ex42_function

JavaScript Function

  • "ν•¨μˆ˜λŠ” 1κΈ‰ 객체이닀."
  • "First Citizen"
  • ν•¨μˆ˜λ₯Ό 객체처럼 μ·¨κΈ‰ν•œλ‹€. > ν•¨μˆ˜λ₯Ό κ°’(데이터)으둜 μ‚¬μš©ν•  수 μžˆλ‹€.
  1. ν•¨μˆ˜λ₯Ό λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰에 담을 수 μžˆλ‹€.(μ €μž₯)
  2. ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό 전달할 수 μžˆλ‹€.
  3. ν•¨μˆ˜λ₯Ό λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

JavaScriptμ—μ„œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법

  1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ
  2. ν•¨μˆ˜ ν‘œν˜„μ‹(λ¦¬ν„°λŸ΄) == 읡λͺ… ν•¨μˆ˜
//ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function m1() {
  alert("m1");
}
m1();

//ν•¨μˆ˜ ν‘œν˜„μ‹
let f2 = function () {
	alert("읡λͺ… ν•¨μˆ˜");
};
f2();

//1. 가독성 ν–₯상
//2. 가독성 ν–₯상 -> ν•΄λ‹Ή ν•¨μˆ˜μ˜ μš©λ„λ₯Ό λ²—μ–΄λ‚œ μ‚¬μš©μ΄ μ—†λ‹€.
// μ•„λž˜κ°€ 보편적인 μ‚¬μš©
document.getElementById("btn2").onclick = function () {
  alert("btn2");
};

// let temp = m8();
// temp();

// μœ„μ™€ κ°™λ‹€.
m8()();

ex43_window

window 객체

  • window.open()
  • window.close()
  • window.alert() -> alert()
  • window.confirm()
  • window.prompt()
  • window.setTimeout()
  • window.setInterval()
    ...

JavaScript의 μ „μ—­ λ³€μˆ˜μ™€ λͺ¨λ“  ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ window 객체의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

var a1 = "홍길동"; //μ „μ—­ λ³€μˆ˜ > λ³€μˆ˜(X), ν”„λ‘œνΌν‹°(O)
let a2 = "ν•˜ν•˜ν•˜"; // window ν”„λ‘œνΌν‹°(X)
const a3 = "호호호"; // window ν”„λ‘œνΌν‹°(O)

ex44_closure

ν΄λ‘œμ €, Closure

μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜λ₯Ό λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•  λ•Œ

  • μ‹œκ°„μ°¨μ— 따라 μ™ΈλΆ€ 지역 λ³€μˆ˜κ°€ μ†Œλ©Έ ν›„ λ‚΄λΆ€ν•¨μˆ˜μ˜ 호좜 λ°œμƒ
  • μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜λ₯Ό λ‚˜μ€‘μ— μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ λ³„λ„μ˜ 곡간에 μ €μž₯ > Closure

ex45_template

Template String

  • ES6

JavaScript λ¬Έμžμ—΄ ν‘œκΈ°λ²•

  1. 'string'
  2. "string"
  3. `string` > template string
let name = "홍길동";
let age = 20;

console.log(`이름은 ${name}이고, λ‚˜μ΄λŠ” ${age - 1}μ„Έμž…λ‹ˆλ‹€.`);

// μ—”ν„° κ°€λŠ₯
let temp = `
ν•˜λ‚˜
λ‘˜
μ…‹`;
console.log(temp);

ex46_event

이벀트 버블링(Event Bubbling) vs 이벀트 터널링(Event Tunneling) == 이벀트 캑쳐링(Event Capturing)

이벀트 터널링

μ΅œμƒμœ„ νƒœκ·ΈλΆ€ν„° ν•˜μœ„ νƒœκ·ΈκΉŒμ§€ λ‚΄λ €κ°€λŠ” 것
ex) html -> body -> div

이벀트 버블링

ν•˜μœ„νƒœκ·ΈλΆ€ν„° μ΅œμƒμœ„ νƒœκ·ΈκΉŒμ§€ μ˜¬λΌκ°€λŠ” 것
ex) div -> body -> html

이벀트 터널링

  • 지원 μ•ˆν•¨

이벀트 버블링

  • 지원함
  • κΈ°λ³Έκ°’

이벀트 버블링을 μ—¬κΈ°μ„œ 쀑단해라! > 더 μ΄μƒμ˜ μ΄λ²€νŠΈκ°€ μ—†λ‹€.
event.cancelBubble = true;

window의 ν‚€ 이벀트 > λͺ¨λ“  상황에 늘 λ°œμƒ

μ•„λ¬΄μ—κ²Œλ„ ν¬μ»€μŠ€κ°€ μ—†λ‹€λ©΄ windowκ°€ 가지고 μžˆλ‹€κ³  μƒκ°ν•˜μž.

// κΈ°λ³Έ -> 이벀트 버블링 방식
p1.addEventListener("click", () => {
    alert("λΉ¨κ°•");
});

// true -> 이벀트 터널링 방식
p1.addEventListener(
  "click",
  () => {
    alert("λΉ¨κ°•");
  },
  true
);

λΆ€λͺ¨μžμ‹μ΄ κ²Ήμ³μžˆμ„ λ•Œ μ–΄λ–€ 이벀트λ₯Ό 먼저할지 μƒκ°ν•˜κ³  μ‚¬μš©ν•œλ‹€.

  • λΆ€λͺ¨ λ¨Όμ € -> 터널링
  • μžμ‹ λ¨Όμ € -> 버블링

ex47_event

μ΄λ²€νŠΈκ°€ λ°œμƒλœ 객체(νƒœκ·Έ)

-> 이벀트 λ°œμƒμ— κ΄€λ ¨λœ 계측 쀑 μ΅œν•˜μœ„ 객체(μœ ν„΄ 객체)

  • event.target
  • event.srcElement

event.target = μœ ν„΄κ°μ²΄. 터널링이 λλ‚˜κ³  버블링이 λ°œμƒν•˜λŠ” 객체.

λ°”λ‘œ μ›ν•˜λŠ” 이벀트 μ„ νƒν•˜κΈ°

event.target.bgColor = "gold";
-> ν˜„μž¬ νƒ€κ²Ÿμ΄ μ›ν•˜λŠ” λŒ€μƒκ³Ό μΌμΉ˜ν•˜λŠ” 경우 μ‚¬μš©

event.currentTarget.bgColor = "gold";
-> μœ„μ˜ νƒ€κ²Ÿκ³Ό λ‹€λ₯Έ λŒ€μƒμΌ λ•Œ μ •λ°€ν•œ ν˜„μž¬ νƒ€κ²Ÿμ„ λ°›μ•„μ˜¨λ‹€.

tr[i].bgColor = "gold";
-> 되긴 ν•˜λŠ”λ° μ΄κ±°λŠ” μ‚¬μš© κΈˆμ§€

ex48_event

//κΈ°μ‘΄ 이미지 제거
event.currentTarget.removeChild(
	event.currentTarget.firstElementChild
);

//μƒˆ 이미지 μΆ”κ°€
let img = document.createElement("img");
img.setAttribute("src", "../asset/images/rect_icon01.png");
event.currentTarget.appendChild(img);

// ν΄λ¦­ν•œ 이미지λ₯Ό μ‚­μ œ
//- λΆ€λͺ¨νƒœκ·Έ.removeChild(μžμ‹νƒœκ·Έ)
// event.target.removeChild(event.target.firstElementChild);

// event.target.parentElement.removeChild(event.target);

// λ°”λ‘œ μœ„ μ½”λ“œμ™€ κ°™μŒ
event.currentTarget.removeChild(
  event.currentTarget.firstElementChild
);

// 우클릭 메뉴 μ§€μš°κΈ°
//<body>
window.oncontextmenu = () => {
  return false;
};

ex49_event

enter/leave μžμ‹ μš”μ†Œμ— 문제 없이 κΉ”λ”ν•œ μ‚¬μš© κ°€λŠ₯

μΌλ°˜μ μœΌλ‘œλŠ” over/out μ‚¬μš©

λ³΄μ‘°ν‚€μ˜ 눌림 μƒνƒœ

console.log(event.ctrlKey);
console.log(event.shiftKey);
console.log(event.altKey);

const img = document.createElement("img");
if (event.ctrlKey) {
  img.setAttribute("src", "../asset/images/rect_icon06.png");
} else {
  img.setAttribute("src", "../asset/images/rect_icon07.png");
}
event.target.appendChild(img);

ex50

λ°©ν–₯ν‚€ 문제 예제

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #tbl1 {
        border: 1px solid black;
        border-collapse: collapse;
        width: 500px;
        height: 500px;
      }
      #tbl1 td {
        border: 1px solid black;
      }
    </style>
  </head>
  <body>
    <!-- ex50.html -->
    <table id="tbl1">
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
    </table>

    <script>
      const list = document.querySelectorAll("#tbl1 td");
      let index = 0;

      // for (let i = 0; i < list.length; i++) {
      //   list[i].innerText = i;
      // }

      list[index].bgColor = "gold";

      window.onkeydown = () => {
        if (event.keyCode == 37) {
          clearBackgroundColor();
          index--;
          if (index < 0) {
            index = list.length - 1;
          }
        } else if (event.keyCode == 39) {
          clearBackgroundColor();
          index++;
          if (index >= list.length) {
            index--;
          }
        } else if (event.keyCode == 40) {
          clearBackgroundColor();
          index += 5;
          if (index >= list.length) {
            index -= 5;
          }
        } else if (event.keyCode == 38) {
          clearBackgroundColor();
          index -= 5;
          if (index < 0) {
            index += 5;
          }
        }
        list[index].bgColor = "gold";
      };

      function clearBackgroundColor() {
        for (let i = 0; i < list.length; i++) {
          list[i].bgColor = "transparent";
        }
      }
    </script>
  </body>
</html>
profile
μ°¨κ·Όμ°¨κ·Ό ν•˜λ‚˜μ”©

0개의 λŒ“κΈ€