μ€λμ μλ°μ€ν¬λ¦½νΈμμ μ€μν κ°λ μ€ νλμΈ ν΄λ‘μ μ λν΄ μμλ³΄κ² μ΅λλ€. ν΄λ‘μ λ μλ°μ€ν¬λ¦½νΈμ κ°λ ₯ν κΈ°λ₯ μ€ νλμ λλ€. μ΄ κΈμμλ ν΄λ‘μ μ κΈ°λ³Έ κ°λ λΆν° μ€μ μμ κΉμ§ μμΈν λ€λ£° μμ μ΄λ, λκΉμ§ ν¨κ» ν΄μ£ΌμΈμ!
β£ λͺ©μ°¨
- ν΄λ‘μ μ κΈ°λ³Έ κ°λ μ΄ν΄νκΈ°π§
- ν΄λ‘μ μ μ£Όμ νΉμ§κ³Ό μ₯μ π
- μ€μ μμ λ‘ λ°°μ°λ ν΄λ‘μ νμ©λ²π»
- ν΄λ‘μ μ¬μ© μ μ£Όμν μ β οΈ
01. ν΄λ‘μ μ κΈ°λ³Έ κ°λ μ΄ν΄νκΈ°π§
μλ°μ€ν¬λ¦½νΈμ μ€μ½νμ ν΄λ‘μ μ κ΄κ³
ν΄λ‘μ λ₯Ό μ΄ν΄νλ €λ©΄ λ¨Όμ μλ°μ€ν¬λ¦½νΈμ μ€μ½ν(scope) κ°λ μ μμμΌ ν©λλ€. μ€μ½νλ λ³μμ μ ν¨ λ²μλ₯Ό μλ―Ένλ©°, μλ°μ€ν¬λ¦½νΈλ ν¨μ μ€μ½νμ λΈλ‘ μ€μ½νλ₯Ό μ§μν©λλ€.
μλ°μ€ν¬λ¦½νΈ μ€μ½νμ μ‘°κΈ λ μμΈν μκ³ μΆλ€λ©΄ μλ ν¬μ€ν μ μ°Έκ³ ν΄ μ£ΌμΈμπ
ν΄λ‘μ μ λμ μ리
ν΄λ‘μ λ ν¨μκ° μ μΈλ λμ μ€μ½νλ₯Ό κΈ°μ΅νλ κΈ°λ₯μ λ§ν©λλ€. μ¦, ν¨μκ° μ€νλ μ΄νμλ ν΄λ‘μ λ κ·Έ ν¨μκ° μ μΈλ νκ²½μ μ°Έμ‘°ν μ μμ΅λλ€.
function outerFunction() {
let outerVariable = 'I am outside!';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
const innerFunc = outerFunction();
innerFunc(); // 'I am outside!' μΆλ ₯
μ μ½λμμ innerFunctionμ outerVariableμ μ°Έμ‘°ν μ μμ΅λλ€. μ΄κ²μ΄ ν΄λ‘μ μ κΈ°λ³Έ λμ λ°©μμ λλ€.
02. ν΄λ‘μ μ μ£Όμ νΉμ§κ³Ό μ₯μ π
λ°μ΄ν° μλ (Data Encapsulation)
ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ ν¨μ λ΄λΆμ λ³μλ₯Ό μΈλΆμμ μ§μ μ κ·Όν μ μλλ‘ ν μ μμ΅λλ€. μ΄λ λ°μ΄ν° μλμ ν΅ν΄ μ½λμ 보μμ±κ³Ό μ μ§λ³΄μμ±μ λμ¬μ€λλ€.
function createCounter() {
let count = 0;
return function() {
count++;
return count;
}
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
λͺ¨λνμ μ½λ μ¬μ¬μ©μ±
ν΄λ‘μ λ λͺ¨λνλ μ½λλ₯Ό μμ±νκ³ μ¬μ¬μ©μ±μ λμ΄λ λ° μ μ©ν©λλ€. ν¨μ ν©ν 리λ μ¦μ μ€ν ν¨μ ννμ(IIFE) λ±μ νμ©νμ¬ λͺ¨λ ν¨ν΄μ ꡬνν μ μμ΅λλ€.
λ°μ΄ν° μΊμ± (Data Caching)
ν΄λ‘μ λ₯Ό μ΄μ©ν΄ κ³μ°λ κ°μ μ μ₯ν΄ λκ³ , κ°μ κ³μ°μ λ°λ³΅μ μΌλ‘ νμ§ μλλ‘ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ±λ₯μ μ΅μ νν μ μμ΅λλ€.
function createCachedFunction() {
const cache = {};
return function(key, computeFunc) {
if (!cache[key]) {
cache[key] = computeFunc();
}
return cache[key];
}
}
const cachedCompute = createCachedFunction();
const result1 = cachedCompute('result', () => {
console.log('Computing result...');
return 42;
});
const result2 = cachedCompute('result', () => {
console.log('Computing result...');
return 42;
});
console.log(result1); // 42, 'Computing result...' μΆλ ₯
console.log(result2); // 42, 'Computing result...' μΆλ ₯λμ§ μμ
λ°λ³΅μ μΈ λ°μ΄ν° μΊμ± νμ©
λ°μ΄ν° μΊμ±μ ν΄λ‘μ λ‘ κ΅¬ννλ©΄ λ°λ³΅μ μΈ μ°μ°μμ μ±λ₯μ ν¬κ² ν₯μν μ μμ΅λλ€. νΉν, λμΌν μ°μ°μ΄ λ°λ³΅μ μΌλ‘ μνλλ μν©μμ μ μ©ν©λλ€.
function createFibonacci() {
const cache = {};
function fibonacci(n) {
if (n in cache) {
return cache[n];
}
if (n <= 1) {
return n;
} else {
const result = fibonacci(n - 1) + fibonacci(n - 2);
cache[n] = result;
return result;
}
}
return fibonacci;
}
const fib = createFibonacci();
console.log(fib(10)); // 55
console.log(fib(20)); // 6765
μ μμ μμλ νΌλ³΄λμΉ μμ΄μ κ³μ°ν λ ν΄λ‘μ λ₯Ό μ΄μ©ν΄ μ΄λ―Έ κ³μ°λ κ°μ μΊμ±ν¨μΌλ‘μ¨ μ±λ₯μ μ΅μ ννκ³ μμ΅λλ€.
03. μ€μ μμ λ‘ λ°°μ°λ ν΄λ‘μ νμ©λ² π»
ν¨μ ν©ν 리 (Function Factory)
ν¨μ ν©ν 리λ ν΄λ‘μ λ₯Ό νμ©νμ¬ λμ μΌλ‘ ν¨μλ₯Ό μμ±νλ κΈ°λ²μ λλ€.
function multiplier(factor) {
return function(number) {
return number * factor;
}
}
const double = multiplier(2);
console.log(double(5)); // 10
μ½λ°± ν¨μ (Callback Function)
μ½λ°± ν¨μμμλ ν΄λ‘μ λ₯Ό μμ£Ό μ¬μ©ν©λλ€. μ΄λ²€νΈ νΈλ€λ¬λ λΉλκΈ° μμ μμ μ μ©νκ² νμ©λ©λλ€.
function fetchData(url) {
fetch(url)
.then(response => response.json())
.then(data => {
console.log(data);
});
}
μ΄λ²€νΈ νΈλ€λ¬ (Event Handler)
μ΄λ²€νΈ νΈλ€λ¬μμλ ν΄λ‘μ λ₯Ό μ¬μ©νμ¬ μνλ₯Ό μ μ§ν μ μμ΅λλ€.
function setupEventHandlers() {
let count = 0;
document.getElementById('myButton').addEventListener('click', function() {
count++;
console.log(`Button clicked ${count} times`);
});
}
04. ν΄λ‘μ μ¬μ© μ μ£Όμν μ β οΈ
1. λ©λͺ¨λ¦¬ λμ
ν΄λ‘μ λ ν¨μκ° μΈλΆ ν¨μμ λ³μμ μ κ·Όν μ μκ² ν΄ μ£ΌκΈ° λλ¬Έμ, νμ μλ ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ λ©λͺ¨λ¦¬ λμκ° λ°μν μ μμ΅λλ€. μ΄λ νΉν μ€λ μ€νλλ μ ν리μΌμ΄μ μμ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€.
μ£Όμμ¬ν:
- νμ μλ ν΄λ‘μ λ₯Ό μμ±νμ§ μλλ‘ μ£Όμν©λλ€.
- ν΄λ‘μ κ° λ μ΄μ νμνμ§ μμ λ μ°Έμ‘°λ₯Ό ν΄μ νμ¬ κ°λΉμ§ 컬λ μ μ΄ μ΄λ£¨μ΄μ§λλ‘ ν©λλ€.
2. μ±λ₯ μ ν
ν΄λ‘μ λ ν¨μκ° μ μΈλ λλ§λ€ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νκΈ° λλ¬Έμ, λ§μ ν΄λ‘μ λ₯Ό μμ±νλ©΄ μ±λ₯μ΄ μ νλ μ μμ΅λλ€.
μ£Όμμ¬ν:
- ν΄λ‘μ κ° μ λ§ νμν κ²½μ°μλ§ μ¬μ©ν©λλ€.
- λ°λ³΅λ¬Έ μμμ ν΄λ‘μ λ₯Ό μμ±νλ κ²½μ° μ£Όμν©λλ€.
3. λ³μμ μλͺ»λ μ°Έμ‘°
ν΄λ‘μ λ μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°ν μ μμ§λ§, μμμΉ λͺ»ν κ°μ΄ μ°Έμ‘°λ μ μμ΅λλ€. νΉν λ°λ³΅λ¬Έμμ ν΄λ‘μ λ₯Ό μ¬μ©ν λ μ£Όμν΄μΌ ν©λλ€.
μμ:
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // λͺ¨λ ν΄λ‘μ κ° λ§μ§λ§ κ°μΈ 5λ₯Ό μΆλ ₯ν¨
}, 1000);
}
ν΄κ²°μ± :
- let ν€μλλ₯Ό μ¬μ©νμ¬ λΈλ‘ μ€μ½ν λ³μλ₯Ό μμ±νκ±°λ, μ¦μ μ€ν ν¨μ(IIFE)λ₯Ό μ¬μ©ν©λλ€.
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // κ° ν΄λ‘μ κ° κ³ μ ν κ°μ μΆλ ₯ν¨
}, 1000);
}
4. μ½λ κ°λ μ± μ ν
ν΄λ‘μ λ₯Ό κ³Όλνκ² μ¬μ©νλ©΄ μ½λκ° λ³΅μ‘ν΄μ§κ³ μ΄ν΄νκΈ° μ΄λ €μμ§ μ μμ΅λλ€. μ΄λ μ μ§λ³΄μμ μ΄λ €μμ μ€ μ μμ΅λλ€.
μ£Όμμ¬ν:
- ν΄λ‘μ λ₯Ό μ¬μ©νλ μ΄μ λ₯Ό λͺ νν νκ³ , μ£Όμμ ν΅ν΄ μ€λͺ μ μΆκ°ν©λλ€.
- ν΄λ‘μ λ₯Ό μ μ ν μΊ‘μννμ¬ μ¬μ©ν©λλ€.
5. λΉλκΈ° ν¨μμμ μ¬μ©
λΉλκΈ° ν¨μμ ν΄λ‘μ λ₯Ό ν¨κ» μ¬μ©ν λ μ£Όμν΄μΌ ν©λλ€. ν΄λ‘μ κ° λΉλκΈ° ν¨μ λ΄λΆμμ μ¬μ©λ λ, μλν μμ μ μ¬λ°λ₯Έ κ°μ μ°Έμ‘°νλμ§ νμΈν΄μΌ ν©λλ€.
μμ:
function fetchData(url) {
var data = "old data";
setTimeout(function() {
console.log(data); // "old data"κ° μΆλ ₯λ¨
}, 1000);
// λΉλκΈ° μμ
μ΄ μλ£λ ν λ°μ΄ν°κ° λ³κ²½λ¨
data = "new data";
}
fetchData('example.com');
ν΄κ²°μ± :
- ν΄λ‘μ λ΄λΆμμ νμν λ°μ΄ν°λ₯Ό 미리 μ μ₯νκ±°λ, λΉλκΈ° μμ μ΄ μλ£λ νμ ν΄λ‘μ λ₯Ό μ€νν©λλ€.
function fetchData(url) {
var data = "old data";
setTimeout((function(dataCopy) {
return function() {
console.log(dataCopy); // "old data"κ° μΆλ ₯λ¨
};
})(data), 1000);
data = "new data";
}
fetchData('example.com');
μ΄μ κ°μ μ£Όμμ¬νμ λͺ μ¬νλ©΄ ν΄λ‘μ λ₯Ό λμ± μμ νκ³ ν¨κ³Όμ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.