π μλ°μ€ν¬λ¦½νΈ(JavaScript) κΈ°λ³Έ λ€μ§κΈ° - Part 2
ν¨μ, κ°μ²΄/λ°°μ΄, DOM, this, μ€ν 컨ν μ€νΈ μμ μ 볡
μλ°μ€ν¬λ¦½νΈμ κΈ°λ³ΈκΈ°λ₯Ό λ νννκ² λ§λ€κΈ° μν΄, μ΄λ² κΈμμλ μ€λ¬΄μμ μμ£Ό λ§μ£ΌμΉλ ν΅μ¬ μ£Όμ λ€μ λ€λ€λ³Όκ²μ.
ν¨μμ μ μΈ λ°©μλΆν°, κ°μ²΄μ λ°°μ΄μ νμ©, DOM μ‘°μ, κ·Έλ¦¬κ³ λ§μ κ°λ°μκ° μ²μμ ν·κ°λ €νλ this, μ€ν 컨ν μ€νΈκΉμ§ ν¨κ» μ λ¦¬ν΄ λ³΄κ² μ΅λλ€.
β ν¨μμ λ€μν μ μΈ λ°©μ
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό μ μΈνλ λ°©μμ ν¬κ² μΈ κ°μ§κ° μμ΄μ.
πΉ ν¨μ μ μΈμ (Function Declaration)
function sayHello() {
console.log("μλ
νμΈμ!");
}
sayHello(); // β
μ μΈ μ μλ νΈμΆ κ°λ₯
- μ μΈ μ μ νΈμΆν΄λ μλν΄μ.
- μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ€ν μ μ ν¨μ μ μΈμ νΈμ΄μ€ν (λμ΄μ¬λ¦Ό) νκΈ° λλ¬Έμ΄μμ.
πΉ ν¨μ ννμ (Function Expression)
const sayHi = function() {
console.log("μλ
!");
};
sayHi(); // β
νΈμΆ κ°λ₯ (λ¨, μ μΈ μ΄νλΆν°)
- λ³μμ ν¨μλ₯Ό μ μ₯νλ λ°©μμ΄κ³ , μ μΈ μ΄μ μλ νΈμΆν μ μμ΄μ.
πΉ νμ΄ν ν¨μ (Arrow Function, ES6+)
const greet = (name) => {
console.log(`μλ
, ${name}!`);
};
// λ κ°κ²°νκ² (ν μ€μΌ κ²½μ° return μλ΅ κ°λ₯)
const add = (a, b) => a + b;
ν¨μ μ ν | νΈμ΄μ€ν | this λ°μΈλ© | νΉμ§ |
ν¨μ μ μΈμ | O | μ체 this | μ μΈ μ μλ νΈμΆ κ°λ₯ |
ν¨μ ννμ | X | μ체 this | λ³μμ ν λΉλ νν, μ μΈ ν νΈμΆ |
νμ΄ν ν¨μ | X | μμ μ€μ½ν this | κ°κ²°ν λ¬Έλ², μμ μ€μ½νμ this μ¬μ© |
β κ°μ²΄μ λ°°μ΄μ νμ©
κ°μ²΄(Object)λ key-value μμΌλ‘ μ΄λ£¨μ΄μ§ μλ£ κ΅¬μ‘°μμ.
const user = {
name: "νλΉ",
age: 26,
sayHello: function() {
console.log(`μλ
νμΈμ, ${this.name}μ
λλ€.`);
},
};
user.sayHello(); // μλ
νμΈμ, νλΉμ
λλ€.
μ΄μ²λΌ κ°μ²΄ μμλ λ°μ΄ν°λΏ μλλΌ ν¨μλ λ΄μ μ μμ΄μ. μ΄ ν¨μλ λ³΄ν΅ λ©μλλΌκ³ λΆλ¬μ.
// κ°μ²΄ μμ± μ κ·Ό
console.log(user.name); // νλΉ
console.log(user['age']); // 26
// κ°μ²΄ μμ± μΆκ°/μμ
user.job = 'κ°λ°μ';
user.age = 27;
// κ°μ²΄ μμ± μμ
delete user.age;
// κ°μ²΄ λ©μλ κ°νΈ νκΈ°λ² (ES6+)
const enhancedUser = {
name: "λ―Όμ§",
greet() { // function ν€μλ μλ΅ κ°λ₯
console.log(`Hello, I'm ${this.name}`);
}
};
πΉ λ°°μ΄ (Array)
λ°°μ΄(Array)μ μμκ° μλ κ°λ€μ μ§ν©μ΄μμ.
const fruits = ["μ¬κ³Ό", "λ°λλ", "ν¬λ"];
console.log(fruits[1]); // λ°λλ
fruits.push("λΈκΈ°"); // λ°°μ΄ λμ μΆκ°
// λ°°μ΄ μμ μν
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// for...of ꡬ문 (ES6+)
for (const fruit of fruits) {
console.log(fruit);
}
μμ£Ό μ¬μ©νλ λ°°μ΄ λ©μλ
- map: λ°°μ΄μ κ° μμλ₯Ό λ³νν΄ μ λ°°μ΄ μμ±
- filter: 쑰건μ λ§μ‘±νλ μμλ§ λ¨κΈ΄ μ λ°°μ΄ μμ±
- reduce: λ°°μ΄μ κ°μ νλλ‘ μ€μ (λμ κ³μ°)
- forEach: κ° μμμ λν΄ ν¨μ μ€ν (λ°ν κ°μμ)
- find: 쑰건μ λ§μ‘±νλ 첫 λ²μ§Έ μμ λ°ν
const nums = [1, 2, 3, 4, 5];
const doubled = nums.map(n => n * 2); // [2, 4, 6, 8, 10]
const odd = nums.filter(n => n % 2 === 1); // [1, 3, 5]
const sum = nums.reduce((acc, curr) => acc + curr, 0); // 15
nums.forEach(n => console.log(n));
const found = nums.find(n => n > 3); // 4
κΈ°ν λ°°μ΄ λ©μλ
λ©μλ | μ©λ | λ°νκ° | μλ³Έ λ°°μ΄ λ³κ²½ |
push/pop | λμ μΆκ°/μ κ±° | μ κΈΈμ΄/μ κ±°λ μμ | O |
shift/unshift | μμ μ κ±°/μΆκ° | μ κ±°λ μμ/μ κΈΈμ΄ | O |
map | κ° μμ λ³ν | μ λ°°μ΄ | X |
filter | 쑰건 νν°λ§ | μ λ°°μ΄ | X |
reduce | κ° λμ κ³μ° | κ³μ° κ²°κ³Ό | X |
forEach | κ° μμ μν | undefined | X |
slice | μΌλΆ μΆμΆ | μ λ°°μ΄ | X |
splice | μμ κ΅μ²΄ | μ κ±°λ μμ λ°°μ΄ | O |
β DOM μ‘°μ (Document Object Model)
μλ°μ€ν¬λ¦½νΈλ HTML λ¬Έμ(=DOM)λ₯Ό μ‘°μν μ μμ΄μ.
νλ©΄μ ν μ€νΈλ₯Ό λ°κΎΈκ±°λ, μμλ₯Ό ν΄λ¦νμ λ μ΄λ²€νΈλ₯Ό μ²λ¦¬ν μ μμ£ .
πΉ μμ μ ν
const title = document.getElementById("main-title");
const buttons = document.querySelectorAll(".btn");
πΉ ν μ€νΈ, μμ± λ³κ²½
title.textContent = "μλ‘μ΄ μ λͺ©";
title.setAttribute("data-role", "hero");
πΉ ν΄λμ€ μ μ΄
title.classList.add("active");
title.classList.remove("hidden");
πΉ μ΄λ²€νΈ 리μ€λ μΆκ°
const btn = document.querySelector(".btn");
btn.addEventListener("click", () => {
alert("λ²νΌμ΄ ν΄λ¦λμμ΅λλ€!");
});
μ΄λ κ² νλ©΄ HTMLκ³Ό μλ°μ€ν¬λ¦½νΈκ° μ°κ²°λμ΄ μ§μ§λ‘ λμνλ νμ΄μ§λ₯Ό λ§λ€ μ μκ² λΌμ.
β μλ°μ€ν¬λ¦½νΈ μ€ν λ°©μ μ΄ν΄νκΈ°
μλ°μ€ν¬λ¦½νΈλ μ½λκ° μ€νλκΈ° μ μ λ΄λΆμ μΌλ‘ λ€μν κ³Όμ μ κ±°μ³μ.
κ·Έ κ³Όμ μ μλ©΄ λ²κ·Έλ₯Ό μ€μ΄κ³ , μ½λλ₯Ό λ μ ννκ² μμΈ‘ν μ μμ΄μ.
1. νΈμ΄μ€ν (Hoisting)
μλ°μ€ν¬λ¦½νΈλ μ€ν μ μ λ³μμ ν¨μ μ μΈμ λ¨Όμ λμ΄μ¬λ¦¬λ μμ μ ν΄μ.
μ΄κ±Έ νΈμ΄μ€ν μ΄λΌκ³ ν΄μ.
console.log(x); // undefined
var x = 10;
μ΄λ κ² varλ‘ μ μΈν λ³μλ μ μΈλ§ μλ‘ μ¬λΌκ°κ³ , κ°μ ν λΉλμ§ μκΈ° λλ¬Έμ undefinedκ° μΆλ ₯λΌμ.
λ°λ©΄ let, constλ μ΄κΈ°ν μ μ μ κ·Όνλ©΄ μλ¬κ° λ°μν΄μ.
2. this ν€μλ
thisλ νμ¬ μ€ν μ€μΈ λ¬Έλ§₯(context)μ λ°λΌ λ¬λΌμ§λ ν€μλμμ.
const person = {
name: "νλΉ",
sayHello() {
console.log(this.name);
}
};
person.sayHello(); // 'νλΉ'
μ¬κΈ°μλ thisκ° person κ°μ²΄λ₯Ό κ°λ¦¬μΌμ.
νμ§λ§ μλμ²λΌ ν¨μλ§ λ°λ‘ κΊΌλ΄μ μ°λ©΄ λ¬λΌμ Έμ.
const greet = person.sayHello;
greet(); // undefined (λΈλΌμ°μ νκ²½μμλ window.name)
λν νμ΄ν ν¨μλ thisλ₯Ό λ°μΈλ©νμ§ μκ³ , μμ μ΄ μ μΈλ μμΉμ thisλ₯Ό κ·Έλλ‘ μ¬μ©ν΄μ.
3. μ€ν 컨ν μ€νΈ(Execution Context)
μ½λκ° μ€νλκΈ° μ , μλ°μ€ν¬λ¦½νΈ μμ§μ μ€ν νκ²½μ ꡬμ±ν΄μ. μ΄κ±Έ μ€ν 컨ν μ€νΈλΌκ³ λΆλ¦ λλ€.
μ½κ² λ§νλ©΄, λκ° μ€ν μ€μΈμ§, μ΄λ€ λ³μλ€μ΄ μλμ§, μ΄λ€ ν¨μκ° μ΄λμ μλμ§λ₯Ό κΈ°μ΅νλ 곡κ°μ΄μμ.
function outer() {
const outerVar = 'λ°';
function inner() {
console.log(outerVar); // μ€ν 컨ν
μ€νΈ 체μΈμ λ°λΌ μ κ·Ό κ°λ₯
}
inner();
}
outer();
μλ°μ€ν¬λ¦½νΈλ μ€ν μμ λ§λ€ μ€νμ²λΌ 컨ν μ€νΈλ₯Ό μμκ°λ©° μ€ννκ³ ,
μ΄ μ»¨ν μ€νΈλ₯Ό κΈ°μ€μΌλ‘ λ³μλ ν¨μμ μ κ·Όν΄μ. μ΄ κ΅¬μ‘°λ₯Ό μ΄ν΄νλ©΄ ν΄λ‘μ λ this, λΉλκΈ° μ²λ¦¬λ ν¨μ¬ μ΄ν΄νκΈ° μ¬μμ Έμ.
π― λ§λ¬΄λ¦¬ μμ½
- ν¨μλ μ μΈμκ³Ό ννμμ΄ μκ³ , νΈμ΄μ€ν μ¬λΆκ° λ€λ¦ λλ€.
- κ°μ²΄μ λ°°μ΄μ JSμμ κ°μ₯ λ§μ΄ μ¬μ©νλ μλ£ κ΅¬μ‘°μ΄λ©°, λ©μλμ κ³ μ°¨ ν¨μμ μ΅μν΄μ§ νμκ° μμ΄μ.
- DOMμ μ‘°μνλ©΄ HTML μμλ₯Ό λμ μΌλ‘ λ°κΏ μ μκ³ , μ΄λ²€νΈ μ²λ¦¬λ κ°λ₯ν©λλ€.
- this, μ€ν 컨ν μ€νΈ, νΈμ΄μ€ν λ± μλ°μ€ν¬λ¦½νΈμ μ€ν νλ¦μ μ΄ν΄νλ κ²μ μ€λ ₯μ ν λ¨κ³ λμ΄μ¬λ €μ€μ.