πββοΈ ν¨μ(Function)λ,
κ°μ²΄ νμ μ κ°μΌλ‘ λ€λ₯Έ κ°μ²΄μ²λΌ μμ± λ° methodλ₯Ό κ°μ§ μ μκΈ°μ μΌκΈ(first-class) κ°μ²΄μ΄λ©° μΈμλ₯Ό κ°μ§ μ μλ μ½λ λΈλ‘
πβ ν¨μμ νΉμ§
- ν¨μλ κ°μ΄λ―λ‘,
- λ³μμμ λ΄κΈΈ μ μμ (ν¨μ 리ν°λ΄λ‘ μμ±ν ν¨μ κ°μ²΄λ₯Ό λ³μμ ν λΉ κ°λ₯)
- κ°μ²΄μ μμ±μμ methodλ‘ λ΄κΈΈ μ μμ
- λ€λ₯Έ ν¨μμ μΈμκ°μΌλ‘ μ λ¬λ μ μμ
- λ€λ₯Έ ν¨μμ returnκ°μΌλ‘λ μ¬μ© κ°λ₯
- λ°°μ΄μ κ°μΌλ‘λ μ¬μ© κ°λ₯
ν¨μ μ μΈλ¬Έμμλ ν¨μμ μ΄λ¦ μλ΅ λΆκ°
function hello(name) {
return `${name}λ μλ
νμΈμ`;
}
// ν¨μ νΈμΆ
console.log(hello('ν¨μ°'));
ν¨μ ννμμμλ ν¨μλͺ μλ΅ κ°λ₯
// λ³μμ ν λΉνλ©΄μ ν¨μ μμ±
var hello = function (name) {
return `${name}λ μλ
νμΈλ©`;
}
console.log(hello('μΉμ¦'));
ν¨μ ννμμμ ν¨μλͺ μ λͺ μν΄λ λ¬Έμ X
var calc = function add(a, b) {
return a + b;
}
μ΄μ§νΌ calc λ³μλ‘ νΈμΆνλ, ν¨μλͺ (add)μ μλ΅νλ κ²
console.log(calc(10, 20));
// console.log(add(10, 20)); // ReferenceError: add is not defined
πββοΈ ν¨μ νΈμ΄μ€ν (function hoisting)μ΄λ,
ν¨μ μ μΈλ¬Έμ΄ μ½λμ μ λλ‘ λμ΄μ¬λ €μ§ κ² μ²λΌ λμνλ κ²
console.log(hello('ν¨μ°'));
// console.log(hi('μΉμ¦')); // TypeError: hi is not a function
// hiκ° ν¨μμμ΄ νκ°λκΈ° μ΄μ μ νΈμΆνλ©΄ TypeError
// ν¨μ μ μΈλ¬Έ
function hello(name) {
return `${name}λ μ΄μμ€μμΌ. κ·Ήμ§ν λͺ¨μκ² μλλ€`;
}
// ν¨μ ννμ
var hi = function(name) {
return `${name} μλ½?`;
}
console.log(hi('μΉμ¦')); // μμ ν¨μ ννμ μ΄νμ μΆλ ₯ν΄μΌν¨ (ν¨μ νΈμ΄μ€ν
ν¨κ³Ό X)
π Ref.
* ν¨μ μ μΈλ¬Έμ λ°νμ μ΄μ μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ λ¨Όμ μ€ν.
λ°λΌμ ν¨μ μ μΈλ¬Έ μ΄μ μ 'ν¨μλ₯Ό μ°Έμ‘° λ° νΈμΆ κ°λ₯'
* λ³μ ν λΉλ¬Έμ κ°μ ν λΉλ¬Έμ΄ μ€νλλ μμ , μ¦ λ°νμμ νκ°λλ―λ‘ ν¨μ ννμμ 리ν°λ΄λ
ν λΉλ¬Έμ΄ μ€νλλ μμ μ νκ°λμ΄ ν¨μ κ°μ²΄κ° λ¨
ν¨μ ννμμΌλ‘ μ μν ν¨μλ λ°λμ ν¨μ ννμ μ΄νμ μ°Έμ‘°νκ³ νΈμΆν΄μΌν¨
function hello(name) {
console.log(arguments); // μ λ¬λ°μ λͺ¨λ μΈμ μΆλ ₯
return `${name}λ λ°©κ°λ°©κ°νν 리`;
}
// λ§€κ°λ³μλ ν¨μ λ°λ μΈλΆμμ μ°Έμ‘° X
// console.log(name);
var result = hello('ν¨μ°');
console.log(result);
/* μΈμκ° λΆμ‘±ν΄μ ν λΉλμ§ μμ λ§€κ°λ³μμ κ°μ undefined */
result = hello();
console.log(result); // undefinedλ λ°©κ°λ°©κ°νν 리 μΆλ ₯
/* λ§€κ°λ³μλ³΄λ€ μΈμκ° λ λ§μ κ²½μ°, μ΄κ³Όλ μΈμλ 무μ */
result = hello('μΉμ¦', 'μλ―Ό');
console.log(result); // μΉμ¦λ λ°©κ°λ°©κ°νν 리 μΆλ ₯
function hi(name = 'μ무κ°') { // 'μ무κ°'λ‘ κΈ°λ³Έκ° μ€μ
return `Hey~ ${name}`;
}
result = hi('μΉμ¦');
console.log(result); // Hey~ μΉμ¦
result = hi();
console.log(result); // Hey~ μλ¬΄κ° => μΈμλ₯Ό μ λ¬νμ§ μμμ λ κΈ°λ³Έκ° μΆλ ₯
function hello(name) {
return `${name}λ μλ
νμ¬κΉ!`;
// λ°νλ¬Έ μ΄νμ λ¬Έμ μ€νλμ§ μκ³ λ¬΄μ (Unreachable code)
// console.log(name);
}
console.log(hello('μΉμ¦'));
function func() {
console.log('ν¨μκ° νΈμΆ λμμ΅λλ€.');
// return; // λ°ν κ°μ λͺ
μμ μΌλ‘ μ§μ νμ§ μμΌλ©΄ undefined λ°ν
// λ°ν κ°μ΄ μμ μ λ°νλ¬Έ μλ΅ κ°λ₯νλ©° μ΄ λλ μ묡μ μΌλ‘ undefined λ°ν
}
console.log(func()); // λ°νκ°μ΄ μμΌλ―λ‘ undefined μΆλ ₯
πββοΈ νμ΄ν ν¨μ(arrow function)λ,
function ν€μλ λμ νμ΄νλ₯Ό μ¬μ©ν΄ λ³΄λ€ κ°λ΅νκ² ν¨μλ₯Ό μ μΈνλ λ°©λ²
- νμ΄ν ν¨μλ νμ μ΅λͺ ν¨μλ‘ μ μνλ©° λ³Έλ¬Έμ΄ ν μ€μΈ ν¨μλ₯Ό μμ±ν λ μ μ©
message = function() {
return 'Hello Cheese!';
};
console.log(message());
message = () => {
return 'Arrow Function!';
};
console.log(message());
message = () => 'Arrow Functions are so simple!';
console.log(message());
message = (val1, val2) => 'We' + val1 + val2;
console.log(message(" are parameters", '!!'));
λ§€κ°λ³μκ° μκ±°λ μ¬λ¬ κ°μΌ κ²½μ° μλ΅ λΆκ°
message = val1 => 'Just' + val1;
console.log(message(' a parameter'));
πββοΈ μ¦μ μ€ν ν¨μλ,
ν¨μ μ μμ λμμ μ¦μ νΈμΆμ΄ λλ ν¨μλ‘ λ¨ νλ²λ§ νΈμΆλλ©° μ¬νΈμΆ λΆκ°
- μ¦μ μ€νλλ ν¨μλ λ°λμ κ·Έλ£Ή μ°μ°μ
()
λ‘ κ°μΈμΌν¨- μ¦μ μ€ν ν¨μ λ΄μ μ½λλ₯Ό λͺ¨μλλ©΄ νΉμ λ€λ₯Έ μμμ μμμλ μλ λ³μλ ν¨μμ μ΄λ¦ μΆ©λμ μ¬μ μ λ°©μ§ κ°λ₯(μμλΆλ¦¬)
// ν¨μ μ΄λ¦μ΄ μλ μ΅λͺ
(Anonymous) ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ
(function() {
console.log('μ΅λͺ
μ¦μ μ€νν¨μ! ν¨μ μ μμ λμμ νΈμΆ')
})(); // (); : μ¦μ μ€ν(νΈμΆ)
(function hello(name) { // μ¬νΈμΆμ΄ λΆκ°νλ―λ‘ ν¨μλͺ
(hello)μ μλ―Έκ° μμ
console.log('κΈ°λͺ
μ¦μ μ€νν¨μ! ν¨μ μ μμ λμμ νΈμΆ!')
console.log(`${name}λ Hi!`)
})('μΉμ¦'); // λ§€κ°λ³μλΆκ° μμ μ, μΈμλ₯Ό μ΄ μκ΄νΈμ μ λ¬
// hello('ν¨μ°');
// ReferenceError: hello is not defined => μ μ λμ΄μμ§ μμ μ¬νΈμΆ λΆκ°
πβ ν¨μκ° μκΈ° μμ μ νΈμΆνλ κ²μ μ¬κ· νΈμΆμ΄λΌκ³ νλ©°, μ΄ μ¬κ· νΈμΆμ μννλ ν¨μμΈ μ¬κ· ν¨μλ λ°λ³΅λλ μ²λ¦¬λ₯Ό μν΄ μ¬μ©
// n! = 1 * 2 * ... * (n-1) * n;
function factorial(n) {
// nμ΄ 1 μ΄νμΌ λ 1μ λ°ννλ©΄μ μ¬κ·νΈμΆ stop
if(n <= 1) return 1;
// μ¬κ· νΈμΆ
return n * factorial(n - 1);
}
console.log(factorial(1)); // 1 (1)
console.log(factorial(2)); // 2 (2 * 1)
console.log(factorial(3)); // 6 (3 * 2 * 1)
console.log(factorial(4)); // 24 (4 * 3 * 2 * 1)
console.log(factorial(5)); // 120 (5 * 4 * 3 * 2 * 1)
πβ ν¨μ λ΄λΆμ μ μλ ν¨μλ₯Ό μ€μ²© ν¨μ λλ λ΄λΆ ν¨μλΌκ³ νλ©°, μ€μ²© ν¨μλ₯Ό ν¬ν¨νλ ν¨μλ μΈλΆ ν¨μ.
- μΌλ°μ μΌλ‘ μ€μ²© ν¨μλ μμ μ ν¬ν¨νλ μΈλΆ ν¨μλ₯Ό λλ ν¬νΌ ν¨μμ μν
function outer() {
var outerVal = 'μΈλΆ ν¨μ';
function inner() { // λ΄λΆ ν¨μ : μΈλΆ ν¨μμ helper μν
var innerVal = 'λ΄λΆ ν¨μ';
console.log(outerVal + "," + innerVal);
// μΈλΆ ν¨μμ λ³μλ₯Ό λ΄λΆ ν¨μμμ μ°Έμ‘° κ°λ₯
}
inner();
// outerν¨μ μμμ innerν¨μλ₯Ό νΈμΆν΄μΌ μλμ outerν¨μ νΈμΆμ΄ μ μ μλ
}
outer();
πββοΈ μ½λ°± ν¨μ & κ³ μ°¨ ν¨μλ,
- μ½λ°± ν¨μ : ν¨μμ λ§€κ°λ³μλ₯Ό ν΅ν΄ λ€λ₯Έ ν¨μμ λ΄λΆλ‘ μ λ¬λλ ν¨μ (κ³ μ°¨ ν¨μμ μ λ¬λμ΄ ν¬νΌ ν¨μμ μν )
- κ³ μ°¨ ν¨μ : λ§€κ°λ³μλ₯Ό ν΅ν΄ ν¨μμ μΈλΆμμ μ½λ°± ν¨μλ₯Ό μ λ¬ λ°μ ν¨μ
// μ λ¬ λ°λ κ°μ μ¦κ° μμΌμ£Όλ ν¨μ (μ½λ°± ν¨μ)
function increase(value) {
return value + 1;
}
// μ λ¬ λ°μ κ°μ κ°μ μμΌμ£Όλ ν¨μ (μ½λ°± ν¨μ)
function decrease(value) {
return value - 1;
}
// μ λ¬ λ°μ ν¨μμ μ λ¬ λ°μ κ°μ μ μ© μμΌμ£Όλ κ³ μ°¨ ν¨μ
function apply(func, value) { // (μ νν ν¨μλͺ
, κ°)
// κ³ μ°¨ ν¨μλ λ§€κ°λ³μλ₯Ό ν΅ν΄ μ λ¬ λ°μ μ½λ°± ν¨μμ νΈμΆ μμ μ κ²°μ ν΄μ νΈμΆ
// μ½λ°± ν¨μλ κ³ μ°¨ ν¨μμ μν΄ νΈμΆ λλ©° μ΄ λ κ³ μ°¨ ν¨μλ νμμ λ°λΌ μ½λ°± ν¨μμ μΈμ μ λ¬ κ°λ₯
return func(value);
}
// κ³ μ°¨ ν¨μλ‘ μ½λ°± ν¨μλ₯Ό μ λ¬νλ©° νΈμΆ
console.log(apply(increase, 5));
console.log(apply(decrease, 5));
μ½λ°± ν¨μλ₯Ό μ΅λͺ ν¨μ 리ν°λ΄λ‘ μ μνλ©΄μ λ°λ‘ κ³ μ°¨ ν¨μμ μ λ¬νλ κ²μ΄ μΌλ°μ
console.log(apply(function(value){ return value + 1; }, 10)); // κ΅³μ΄ increase ν¨μλ₯Ό λ§λ€ νμ X
// Arrow functionλ νμ© κ°λ₯
console.log(apply(value => value - 1, 10));
π Ref.
* ν¨μμ λ³νμ§ μλ κ³΅ν΅ λ‘μ§μ 미리 μ μν΄λκ³ κ²½μ°μ λ°λΌ λ³κ²½λλ λ‘μ§μ μΆμνν΄μ
ν¨μμ μΈλΆμμ λ΄λΆλ‘ μ λ¬νλ λ°©μ. μ½λ°± ν¨μλ λΉλκΈ° μ²λ¦¬(μ΄λ²€νΈ, νμ΄λ¨Έ, ajax)μμ
νμ©λλ μ€μν ν¨ν΄μ΄λ©° λ°°μ΄ κ³ μ°¨ ν¨μμμλ μ¬μ©
* ex)
console.log([3, 1, 4, 2, 5].sort((left, right) => right - left));
// (left, right) => right - leftλ₯Ό sort(κ³ μ°¨ ν¨μ)μ μ λ¬νμ¬ κΈ°μ€ μ€μ
πββοΈ μμ ν¨μ & λΉμμ ν¨μ λ,
- μμ ν¨μ : μΈλΆ μνμ μμ‘΄νμ§λ μκ³ λ³κ²½νμ§λ μλ ν¨μ
- λΉμμ ν¨μ : μΈλΆ μνμ μμ‘΄νκ±°λ μΈλΆ μνλ₯Ό λ³κ²½νλ ν¨μ
- π ν¨μ μΈλΆ μνμ λ³κ²½μ μ§μνλ 'μμ ν¨μ'λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ
var cnt = 0;
// μμ ν¨μλ μ΅μ νλ μ΄μμ μΈμλ₯Ό μ λ¬ λ°μΌλ©° μΈμμ λΆλ³μ±μ μ μ§
function increase(n) {
return ++n;
}
// μμ ν¨μκ° λ°νν κ²°κ³Ό κ°μ λ³μμ μ¬ν λΉ ν΄μ μνλ₯Ό λ³κ²½
cnt = increase(cnt);
console.log(cnt); // 1
// λΉμμ ν¨μλ μΈλΆ μνμ μμ‘΄νλ©° μΈλΆ μνλ₯Ό λ³κ²½
function decrease() {
return --cnt;
}
// λΉμμ ν¨μλ μΈλΆ μν(cnt)λ₯Ό λ³κ²½νλ―λ‘ μν λ³νλ₯Ό μΆμ νκΈ° μ΄λ €μ
decrease(); // νΈμΆ
console.log(cnt); // 0
πββοΈ μΌκΈ κ°μ²΄μ 쑰건
[1] 무λͺ μ 리ν°λ΄λ‘ μμ± κ°λ₯ (μ¦, λ°νμμ μμ± κ°λ₯)
[2] λ³μλ μλ£κ΅¬μ‘°(κ°μ²΄, λ°°μ΄ λ±)μ μ μ₯ κ°λ₯
[3] ν¨μλ λ§€κ°λ³μμ μ λ¬ κ°λ₯
[4] ν¨μμ λ°νκ°μΌλ‘ μ¬μ© κ°λ₯
- ν¨μκ° μΌκΈ κ°μ²΄λΌλ κ²μ ν¨μλ₯Ό κ°μ²΄μ λμΌνκ² μ¬μ©ν μ μλ€λ μλ―Έ
- κ°μ²΄λ "κ°"μ΄λ―λ‘ ν¨μλ κ°κ³Ό λμΌνκ² μ·¨κΈ
- λ³μ ν λΉλ¬Έ, κ°μ²΄μ νλ‘νΌν° κ°, λ°°μ΄μ μμ, ν¨μ νΈμΆμ μΈμ, ν¨μ λ°νλ¬Έ λ±μμ μ¬μ© κ°λ₯
// [1] 무λͺ
μ 리ν°λ΄λ‘ μμ± κ°λ₯
// [2] λ³μμ μ μ₯ κ°λ₯
var hello = function() { // function() { return 'Hi there!';} : ν¨μμ 리ν°λ΄(무λͺ
)
return 'Hi there!';
};
// [2] κ°μ²΄μ μ μ₯ κ°λ₯
var obj = { hello }; // var obj = { 'hello' : hello }; : μλ νν
// [3] ν¨μμ λ§€κ°λ³μμ μ λ¬ κ°λ₯
function repeat(func, count) {
for(var i = 0; i < count; i++) {
console.log(func());
}
// [4] ν¨μμ λ°νκ°μΌλ‘ μ¬μ© κ°λ₯
return function() { // repeat νΈμΆ μ, μ΄ ν¨μ 리ν΄
console.log(`${count}λ² λ°λ³΅ μλ£`);
}
}
var returnFunc = repeat(obj.hello, 5); // repeat(obj.hello, 5) : Hi there! λ€μ― λ² μΆλ ₯
returnFunc(); // '5λ² λ°λ³΅ μλ£' μΆλ ₯
>>> repeatμ νΈμΆνκ³ λ¦¬ν΄ λ°μ κ²μ΄ λ΄κΈ΄ returnFuncλ³μλ₯Ό ν¨μ νΈμΆνλ―μ΄ νΈμΆ(ν¨μλ₯Ό λ΄μ λ³μμ΄λ―λ‘)