4. ν¨μμ νλ‘ν νμ 체μ΄λ - 1
μ΄ κΈμ κ³ νμ€, μ‘νμ£Ό λμ μΈμ¬μ΄λ μλ°μ€ν¬λ¦½νΈλ₯Όμ°Έμ‘°νμ¬ μμ±ν κΈμ λλ€.
JavaScriptμ κ°μ₯ μ€μν κ°λ 1μμλ λΉμ°ν ν¨μλ€. JSμ ν¨μλ λͺ¨λν μ²λ¦¬λ ν΄λ‘μ , κ°μ²΄ μμ± λ± μλ°μ€ν¬λ¦½νΈμ κ·Όκ°μ΄ λλ λ§μ κΈ°λ₯μ μ 곡νκ³ μλ€.
#
ν¨μ μ μJSμμ ν¨μλ₯Ό μμ±νλ λ°©λ²μ 4κ°μ§μ΄λ€.
ν¨μ μ μΈλ¬Έ(function statement)
ν¨μ ννμ(function expression)
Function()
μμ±μ ν¨μ- (ES6) νμ΄ν ν¨μ(arrow function)
#
ν¨μ 리ν°λ΄λ¦¬ν°λ΄ : ν¨μλ₯Ό μμ±νλ νκΈ°λ²μΌλ‘ μκ°νλ©΄ λλ€. ex) κ°μ²΄ 리ν°λ΄, λ°°μ΄ λ¦¬ν°λ΄ ...
function add(x, y) { return x + y;}
ν¨μ 리ν°λ΄μ ν¬κ² λ€ λΆλΆμΌλ‘ ꡬμ±λλ€.
function
ν€μλ : ν¨μ 리ν°λ΄μfunction
ν€μλλ‘ μμ.ν¨μλͺ [μ΅μ λ] : ν¨μ λ΄λΆ μ½λμμ μ¬κ·μ νΈμΆ λλ λλ²κ±°κ° ꡬλΆνκΈ° μνμλ³μλ‘ μ¬μ©.
맀κ°λ³μ 리μ€νΈ : λ€λ₯Έ μΈμ΄μ λ¬λ¦¬ 맀κ°λ³μ νμ μ κΈ°μ νμ§ μλλ€.
ν¨μ λͺΈμ²΄ : ν¨μκ° νΈμΆλμ λ μ€νλλ λΆλΆ.
#
ν¨μ μ μΈλ¬Έν¨μ μ μΈλ¬Έμ ν¨μ 리ν°λ΄ ννλ₯Ό κ·Έλλ‘ μ΄μ©νλλ°, ν¨μ μ μΈμ κ²½μ° λ°λμ ν¨μλͺ μ΄ μμ΄μΌ νλ€.
function add(x, y) { return x + y;}
β ν¨μ μ μΈμ
hoisting
μ΄ λ°μνλ―λ‘ μ¬μ©μ μ£Όμ. (ν¨μ ννμ μ¬μ©μ κΆμ₯)
#
ν¨μ ννμν¨μ 리ν°λ΄λ‘ νλμ ν¨μλ₯Ό λ§λ€κ³ λ³μμ ν λΉνμ¬ ν¨μλ₯Ό μμ±νλ κ²μ ν¨μ ννμμ΄λΌκ³ νλ€.
μ΄ κ²½μ° ν¨μλͺ μ΄ μ ν μ¬νμ΄λ©° λ³΄ν΅ μ¬μ©νμ§ μλλ€. μ΄λ¬ν ν¨μλ₯Ό μ΅λͺ ν¨μλΌ νλ€.
var add = function (x, y) { return x + y;};
var plus = add;
console.log(add(3, 4)); // 7console.log(plus(5, 6)); // 11
μ¬κΈ°μ
add
λ³μλ ν¨μ 리ν°λ΄λ‘ μμ±ν ν¨μλ₯Ό μ°Έμ‘°νλ λ³μμ΄μ§ ν¨μλͺ μ΄ μλλ€. μ΄λ¬ν λ³μλ₯Ό ν¨μ λ³μλΌκ³ λΆλ₯Έλ€.ν¨μ λ³μ
add
λ ν¨μμ μ°Έμ‘°κ°μ κ°μ§λ―λ‘ λ€λ₯Έ λ³μplus
μλ κ·Έλλ‘ ν λΉν μ μλ€.ν¨μ λ³μλ₯Ό μ¬μ©ν΄ ν¨μλ₯Ό νΈμΆν μ μλ€.
ν¨μ μ΄λ¦μ ν¬ν¨νμ¬ μμ±ν μλ μλλ° μ΄λ¬ν ν¨μλ₯Ό κΈ°λͺ ν¨μλΌ νλ€.
var add = function sum(x, y) { return x + y;};
console.log(add(3, 4)); // 7console.log(sum(3, 4)); // Error: sum is not defined
sum(3,4)
μ νΈμΆμ΄ Error
κ° λ°μνλλ° ν¨μ ννμμ μ¬μ©λ ν¨μλͺ
μ μΈλΆμ½λμμ μ κ·Ό λΆκ°νλ€.
ν¨μλͺ μ ν¨μ λ΄λΆμμ μ¬κ·μ μΌλ‘ νΈμΆνκ±°λ λλ²κ±°μμ ν¨μλ₯Ό ꡬλΆν λ μ¬μ©νλ€.
// ν¨μ λ΄λΆ μ¬κ·μ νΈμΆ μμvar factorialVar = function factorial(n) { if (n <= 1) { return 1; } return n * factorial(n - 1);};
console.log(factorialVar(3));
μμμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν κ²½μ°μ ν¨μλͺ μΌλ‘ νΈμΆνμ¬ νΌλμ€λ¬μΈ μ μλλ°, ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μλ λ€μκ³Ό κ°μ ν¨μ ννμ ννλ‘ λ³κ²½λκΈ° λλ¬Έμ΄λ€.
var add = function add(x, y) { return x + y;};
ν¨μ μ΄λ¦κ³Ό ν¨μ λ³μμ μ΄λ¦μ΄ add
λ‘ κ°μΌλ―λ‘ μ€μ λ‘λ add
ν¨μ λ³μλ‘ ν¨μμΈλΆμμ νΈμΆμ΄ κ°λ₯νκ² λ κ²μ΄λ€.
β ν¨μ μ μΈλ¬Έκ³Ό ν¨μ ννμμμ μΈλ―Έμ½λ‘
ν¨μ μ μΈλ¬ΈμΌλ‘ ν¨μλ₯Ό μ μν λλ ν¨μ λμ μΈλ―Έμ½λ‘ μ λ°λ‘ λΆμ΄μ§ μκ³ ,
ν¨μ ννμμΌλ‘ ν¨μλ₯Ό μ μν λλ ν¨μ λμ μΈλ―Έμ½λ‘ μ λΆμ΄λ κ²μ κΆμ₯νλ€.
μΌλ°μ μΈ νλμ κ΄μ΅μ΄λ€.
Function()
μμ±μ ν¨μ#
JSμ ν¨μλ Function()
μ΄λΌλ κΈ°λ³Έ λ΄μ₯ μμ±μ ν¨μλ‘λΆν° μμ±λ κ°μ²΄μ΄λ€.
μμ μ΄ν΄λ³Έ ν¨μ μ μΈλ¬Έμ΄λ ν¨μ ννμ λ°©μλ κ²°κ΅ λ΄λΆμ μΌλ‘λ Function()
μμ±μ ν¨μλ‘ μμ±λλ€.
new Function (arg1, arg2, ..., argN, functionBody)
- arg1, arg2, ... , argN - ν¨μμ 맀κ°λ³μ- functionBody - ν¨μκ° νΈμΆλ λ μ€νλ μ½λλ₯Ό ν¬ν¨ν λ¬Έμμ΄
var add = new Function('x', 'y', 'return x + y');console.log(add(3, 4)); // 7
μ΄ λ°©λ²μ μμ£Ό μ¬μ©λμ§ μμΌλ―λ‘ μμ μμ€μΌλ‘ μκ³ λμ΄κ°μ.
#
νμ΄ν ν¨μ(arrow function)νμ΄ν ν¨μλ ES6μμ μΆκ°λ λ¬Έλ²μΌλ‘ function
ν€μλ μ¬μ©λ³΄λ€ κ°λ¨νκ² λ§λ€μμλ€. νμ΄ν ν¨μλ νμ μ΅λͺ
ν¨μμ΄λ€.
var add = (x, y) => { return x + y;};
var add = (x, y) => x + y;
add
ν¨μλ₯Ό μ΄μ²λΌ κ°λ¨νκ² μμ±ν μ μλ€. νμ΄ν ν¨μλ ν¨μ bodyκ° ν μ€μΌλ , {}
λ₯Ό μλ΅νλ©΄ return
ν€μλλ₯Ό μλ΅νλ€. ( {}
λ₯Ό μ¬μ©νλ©΄ return
ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ€.)
μν©μ λ°λΌ λ κ°λ¨νκ² μμ±ν μ μλ λͺ κ°μ§ κ·μΉμ΄ μλ€.
// 맀κ°λ³μκ° μλ κ²½μ°var foo = () => console.log('bar');foo(); // bar
// 맀κ°λ³μκ° νλμΈ κ²½μ° () μλ΅ κ°λ₯var foo = (x) => x;console.log(foo('bar')); // bar
// 맀κ°λ³μκ° μ¬λ¬ κ°μΈ κ²½μ°var foo = (a, b) => a + b;console.log(foo(1, 2)); // 3
// ν¨μ bodyκ° μ¬λ¬ μ€μΌ κ²½μ°var foo = (a, b) => { var c = 3; return a + b + c;};console.log(foo(1, 2)); // 6
// κ°μ²΄λ₯Ό λ°νν λvar foo = () => ({a: 1, b: 2, c: 3});console.log(foo()); // { a: 1, b: 2, c: 3 }
μ½λ°± ν¨μ,
this
ν€μλ λ±μμ μ°¨μ΄κ° μλλ°, μ΄λ μΆνμ κΈ°μ
#
ν¨μ νΈμ΄μ€ν (hoisting)ν¨μ μ μΈλ¬Έ ννλ‘ μ μν ν¨μμ μ ν¨ λ²μλ μ½λμ 맨 μ²μλΆν° μμνλ€. μ΄λ₯Ό ν¨μ νΈμ΄μ€ν μ΄λΌκ³ λΆλ₯Έλ€.
μλ°μ€ν¬λ¦½νΈμμλ λ³μ μμ±κ³Ό μ΄κΈ°νμ μμ
μ΄ λΆλ¦¬λΌμ μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ ν¨μννμ, Function()
μμ±μ ν¨μ, νμ΄ν ν¨μμμλ μΌμ΄λμ§ μλλ€.
μ΄λ¬ν ν¨μ νΈμ΄μ€ν μ΄ μ½λμ ꡬ쑰λ₯Ό μ΄μ§λ½ν μ μμΌλ―λ‘ λ§μ μ¬λλ€μ΄ ν¨μ μ μΈ λ°©μμ μΆμ²νμ§ μκΈ°λ νλ€.
#
ν¨μ κ°μ²΄#
ν¨μλ κ°μ²΄λ€JSμμλ ν¨μλ κ°μ²΄λ‘, κΈ°λ³Έ κΈ°λ₯μΈ μ½λ μ€νλΏλ§ μλλΌ ν¨μ μμ²΄κ° μΌλ° κ°μ²΄μ²λΌ νλ‘νΌν°λ€μ κ°μ§ μ μλ€.
function add(x, y) { return x + y;}
add.result = add(3, 2);add.status = 'OK';
console.log(add.result);console.log(add.status);
add()
ν¨μμ λ§μΉ μΌλ° κ°μ²΄μ²λΌ νλ‘νΌν°λ₯Ό λμ μΌλ‘ μμ±νκ³ μ κ·Όν μ μλ€.
#
ν¨μλ κ°μΌλ‘ μ·¨κΈλλ€ν¨μκ° μΌλ° κ°μ²΄μ²λΌ μ·¨κΈλ μ μμΌλ―λ‘ λ€μκ³Ό κ°μ λμμ΄ λͺ¨λ κ°λ₯νλ€.
리ν°λ΄μ μν΄ μμ±
λ³μλ λ°°μ΄μ μμ, κ°μ²΄μ νλ‘νΌν° λ±μ ν λΉ κ°λ₯
ν¨μμ μΈμλ‘ μ λ¬ κ°λ₯
ν¨μμ 리ν΄κ°μΌλ‘ λ¦¬ν΄ κ°λ₯
λμ μΌλ‘ νλ‘νΌν°λ₯Ό μμ± λ° ν λΉ κ°λ₯
β μ΄λ¬ν κΈ°λ₯μ΄ λͺ¨λ κ°λ₯ν κ°μ²΄λ₯Ό μΌκΈ κ°μ²΄(First Class)λΌκ³ νλ€. μ΄λ¬ν νΉμ±μΌλ‘ ν¨μν νλ‘κ·Έλλ°μ΄ κ°λ₯νλ€.
#
λ³μλ νλ‘νΌν°μ κ°μΌλ‘ ν λΉ// λ³μμ ν¨μ ν λΉvar bar = function () { return 100;};console.log(bar()); // 100
// νλ‘νΌν°μ ν¨μ ν λΉvar obj = {};obj.baz = function () { return 200;};console.log(obj.baz()); // 200
#
ν¨μ μΈμλ‘ μ λ¬// ν¨μ ννμμΌλ‘ foo() ν¨μ μμ±var foo = function (func) { func(); // μΈμλ‘ λ°μ func() ν¨μ νΈμΆ};
// foo() ν¨μ μ€νfoo(function () { console.log('Function can be used as the argument.');});
#
λ¦¬ν΄ κ°μΌλ‘ νμ©// ν¨μλ₯Ό 리ν΄νλ foo() ν¨μ μ μvar foo = function () { return function () { console.log('this function is the return value.'); };};
var bar = foo();bar();
#
ν¨μ κ°μ²΄μ κΈ°λ³Έ νλ‘νΌν°ν¨μ μμ μΌλ°μ μΈ κ°μ²΄μ κΈ°λ₯μ μΆκ°μ μΌλ‘, νΈμΆλμ λ μ μλ μ½λλ₯Ό μ€ννλκΈ°λ₯μ κ°μ§κ³ μλ€.
μΌλ° κ°μ²΄μλ λ€λ₯΄κ² μΆκ°λ‘ ν¨μ κ°μ²΄λ§μ νμ€ νλ‘νΌν°κ° μ μλμ΄ μλ€.
function add(x, y) { return x + y;}
console.dir(add);
κ²°κ³Όλ₯Ό μ΄ν΄λ³΄λ©΄, arguments
, caller
, length
λ±κ³Ό κ°μ λ€μν νλ‘νΌν°κ°κΈ°λ³Έμ μΌλ‘ μμ±λ κ²μ νμΈν μ μλ€. μ΄ νλ‘νΌν°λ€μ΄ νμ€ νλ‘νΌν°λ€.
name
: ν¨μ μ΄λ¦ (μ΅λͺ ν¨μμΈ κ²½μ° λΉ λ¬Έμμ΄)caller
: μμ μ νΈμΆν ν¨μ.arguments
: ν¨μλ₯Ό νΈμΆν λ μ λ¬λ μΈμκ°.length
: ν¨μλ₯Ό μμ±ν λ μ μν μΈμ κ°μ.prototype
: μ΄ ν¨μκ° μμ±μλ‘ μ¬μ©λ λ μ΄ ν¨μλ₯Ό ν΅ν΄ μμ±λ κ°μ²΄μ λΆλͺ¨μν μ νλ νλ‘ν νμ κ°μ²΄__proto__
: μμ μ λΆλͺ¨ μν μ νλ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ[[Prototype]]
(Function.prototype
)
β μΆλ ₯κ°μ νμΈν΄λ³΄λ©΄ ν¬λ‘¬μμλ
Empty()
ν¨μ
Function.prototype
κ°μ²΄μ νλ‘ν νμ κ°μ²΄λ?
λͺ¨λ ν¨μλ€μ λΆλͺ¨ κ°μ²΄μΈ Function.prototype
μ λΆλͺ¨λ μμΈμ μΌλ‘ Object.prototype
κ°μ²΄
#
ν¨μ κ°μ²΄μ νλ‘ν νμ κ°μ²΄μμ κ΄κ³myFunction()
ν¨μμ νλ‘ν νμ
, myFunction.prototype
κ°μ²΄λ constructor
μ __proto__
λΌλ λ κ°μ νλ‘νΌν°κ° μλ€.
myFunction.prototype.constructor
μ κ°μ μΆλ ₯ν΄λ³΄λ©΄, νλ‘ν νμ
κ°μ²΄μ 맀νλν¨μλ₯Ό λ³Ό μ μλλ° myFunction()
ν¨μλ₯Ό κ°λ¦¬ν€κ³ μλ€.