Chapter 04 - norux/javascript_study GitHub Wiki

**Table of Contents** # 4. ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž… 체이닝

이 μž₯μ—μ„œλŠ” ν•¨μˆ˜μ™€ κ΄€λ ¨λœ λ‹€μŒμ˜ κ°œλ…μ— λŒ€ν•΄ μ•Œμ•„λ³Έλ‹€.

  • ν•¨μˆ˜ 생성
  • ν•¨μˆ˜ 객체
  • λ‹€μ–‘ν•œ ν•¨μˆ˜ ν˜•νƒœ
  • ν•¨μˆ˜ 호좜과 this
  • ν”„λ‘œν† νƒ€μž…κ³Ό ν”„λ‘œν† νƒ€μž… 체이닝

Top

4.1 ν•¨μˆ˜ μ •μ˜

ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 3κ°€μ§€ 방법

  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ (Function Statement)
  • ν•¨μˆ˜ ν‘œν˜„μ‹ (Function Expression)
  • Function() μƒμ„±μž ν•¨μˆ˜

Top

4.1.1 ν•¨μˆ˜ λ¦¬ν„°λŸ΄

ν•¨μˆ˜ μ—­μ‹œ 일반 객체처럼 κ°’μœΌλ‘œ μ·¨κΈ‰λ˜λ―€λ‘œ, 객체 λ¦¬ν„°λŸ΄λ‘œ 객체λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμ²˜λŸΌ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ ν•¨μˆ˜λ₯Ό 생성할 수 μžˆλ‹€. ν•¨μˆ˜ μ„ μ–Έλ¬Έμ΄λ‚˜ ν•¨μˆ˜ ν‘œν˜„μ‹ 방법 λͺ¨λ‘ 이런 ν•¨μˆ˜ λ¦¬ν„°λŸ΄ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•œλ‹€.

function add(x,y) {
    return x + y;
}

Top

4.1.1.1 ν•¨μˆ˜μ˜ ꡬ성

  1. function ν‚€μ›Œλ“œ: μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ function ν‚€μ›Œλ“œλ‘œ μ‹œμž‘
  2. ν•¨μˆ˜λͺ…: ν•¨μˆ˜λͺ…은 ν•¨μˆ˜λ₯Ό κ΅¬λΆ„ν•˜λŠ” μ‹λ³„μžλ‘œ μ‚¬μš©λ˜μ§€λ§Œ, ν•¨μˆ˜λͺ…은 선택사항이닀. ν•¨μˆ˜λͺ…이 μ—†λŠ” ν•¨μˆ˜λ₯Ό 읡λͺ… ν•¨μˆ˜λΌ ν•œλ‹€.
  3. λ§€κ°œλ³€μˆ˜ 리슀트: λ§€κ°œλ³€μˆ˜λŠ” νƒ€μž…μ„ κΈ°μˆ ν•˜μ§€ μ•ŠλŠ”λ‹€.
  4. ν•¨μˆ˜ λͺΈμ²΄: ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ

Top

4.1.2 ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜ 생성

ν•¨μˆ˜ μ„ μ–Έλ¬Έ 방식은 λ°˜λ“œμ‹œ ν•¨μˆ˜λͺ…이 μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. 이 ν•¨μˆ˜ μ„ μ–Έλ¬Έ 방식은 C/C++의 ν•¨μˆ˜ μ •μ˜ 방법과 μœ μ‚¬ν•˜λ‹€.

// add() ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function add(x, y) {
    return x + y;
}

console.log( add( 3, 4 ) );    // 좜λ ₯κ°’: 7

Top

4.1.3 ν•¨μˆ˜ ν‘œν˜„μ‹ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜ 생성

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ„ ν•˜λ‚˜μ˜ κ°’μ²˜λŸΌ μ·¨κΈ‰λœλ‹€. (μ΄λŸ¬ν•œ νŠΉμ§•λ•Œλ¬Έμ— μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λ₯Ό 일급 객체라고 ν•œλ‹€.) λ”°λΌμ„œ ν•¨μˆ˜λ„ μˆ«μžλ‚˜ λ¬Έμžμ—΄μ²˜λŸΌ λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³ , 이 ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜μ—¬ μƒμ„±ν•˜λŠ” 것을 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λΌ ν•œλ‹€.

// add() ν•¨μˆ˜ ν‘œν˜„μ‹
var add = function (x, y) {
    return x + y;
}

var plus = add;

console.log( add( 3, 4) );     // (좜λ ₯κ°’) 7
console.log( plus( 5, 6) );    // (좜λ ₯κ°’) 11

ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œλŠ” ν•¨μˆ˜ 이름이 선택사항이며, 보톡 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

  1. addλŠ” ν•¨μˆ˜ 이름이 μ•„λ‹Œ, ν•¨μˆ˜ λ³€μˆ˜μ΄λ‹€.
  2. addλŠ” ν•¨μˆ˜μ˜ 참쑰값을 κ°€μ§€λ―€λ‘œ λ³€μˆ˜ plus에도 κ·Έ 값을 ν• λ‹Ήν•  수 μžˆλ‹€.

ch04-2

μœ„ 예제처럼 이름이 μ—†λŠ” ν•¨μˆ˜λ₯Ό 읡λͺ… ν•¨μˆ˜λΌ ν•œλ‹€. λ°˜λŒ€λ‘œ ν•¨μˆ˜ 이름이 ν¬ν•¨λœ ν‘œν˜„μ‹μ„ κΈ°λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λΌ ν•œλ‹€.

κΈ°λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•  λ•ŒλŠ” μ£Όμ˜ν•΄μ•Ό ν•  점이 μžˆλ‹€.

// κΈ°λͺ…ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ ν•¨μˆ˜ 호좜 방법
var add = function sum(x, y) {
    return x + y;
}

consoloe.log( add( 3, 4) );    // (좜λ ₯κ°’) 7
consoloe.log( sum( 3, 4) );    // (좜λ ₯κ°’) μ—λŸ¬ λ°œμƒ!!!

** ν•¨μˆ˜ ν‘œν˜„μ‹μ— μ‚¬μš©λœ ν•¨μˆ˜ 이름이 μ™ΈλΆ€ μ½”λ“œμ—μ„œ μ ‘κ·Ό λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€. **

그럼 ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ‚¬μš©λœ add() ν•¨μˆ˜λŠ” μ–΄λ–»κ²Œ ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ 호좜이 κ°€λŠ₯ν–ˆμ„κΉŒ? ν•¨μˆ˜ μ„ μ–Έλ¬Έμ˜ ν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—μ„œ μ•„λž˜μ™€ 같이 ν•¨μˆ˜ ν‘œν˜„μ‹ ν˜•νƒœλ‘œ λ³€κ²½λœλ‹€.

// μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ ν•¨μˆ˜ ν‘œν˜„μ‹ ν˜•νƒœλ‘œ λ³€κ²½
var add = function add(x, y) {
    return x + y;
}

ν•¨μˆ˜ 이름과 ν•¨μˆ˜ λ³€μˆ˜μ˜ 이름이 add둜 κ°™μœΌλ―€λ‘œ, ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” add ν•¨μˆ˜ λ³€μˆ˜λ‘œ 호좜된 것이닀.

ch04-3

ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œ ν•¨μˆ˜μ΄λ¦„μ€ μ„ νƒμ‚¬ν•­μ΄μ§€λ§Œ, ν•¨μˆ˜ 이름을 μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μž¬κ·€ν˜ΈμΆœμ΄ κ°€λŠ₯ν•˜λ‹€.

// ν•¨μˆ˜ ν‘œν˜„μ‹ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•œ νŒ©ν† λ¦¬μ–Ό ν•¨μˆ˜
var factorialVar = function factorial(n) {
    if( n <= 1 ) {
        return 1;
    }
    return n * factorial( n - 1 );
};

console.log( factorialVar( 3 ) );    // (좜λ ₯κ°’) 6
console.log( factorial( 3 ) );       // (좜λ ₯κ°’) undefined

ch04-4

function statement와 function expressionμ—μ„œμ˜ μ„Έλ―Έμ½œλ‘ 

ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•ŒλŠ” μ„Έλ―Έμ½œλ‘ μ„ 뢙이지 μ•Šμ•˜μ§€λ§Œ, ν•¨μˆ˜ ν‘œν˜„μ‹ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•ŒλŠ” ν•¨μˆ˜ 끝에 μ„Έλ―Έμ½œλ‘ μ„ λΆ™μ˜€λ‹€.

이것은 ν•˜λ‚˜μ˜ κ΄€μŠ΅μœΌλ‘œ, 일반적으둜 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ°©μ‹μœΌλ‘œ μ„ μ–Έλœ ν•¨μˆ˜μ˜ κ²½μš°λŠ” ν•¨μˆ˜ 끝에 μ„Έλ―Έμ½œλ‘ μ„ 뢙이지 μ•Šμ§€λ§Œ, ν•¨μˆ˜ ν‘œν˜„μ‹ λ°©μ‹μ˜ κ²½μš°μ—λŠ” μ„Έλ―Έμ½œλ‘ μ„ λΆ™μ΄λŠ” 것을 ꢌμž₯ν•œλ‹€.

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ κ°€ 문제λ₯Ό μ•ΌκΈ°ν•  수 μžˆλ‹€.

var func = function() {
    return 42;
}     // μ„Έλ―Έμ½œλ‘  μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
(function()) {
    console.log( "function called" );
})();

이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, μ˜λ„μ™€λŠ” λ‹€λ₯΄κ²Œ 'number is not a function'μ΄λΌλŠ” μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ„œκ°€ func() ν•¨μˆ˜ μ •μ˜μ—μ„œ μ„Έλ―Έμ½œλ‘ μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„, return 42; λ¬Έμž₯을 μ§€λ‚˜ func()ν•¨μˆ˜ μ •μ˜ 끝에 μžˆλŠ” } 만으둜 ν•¨μˆ˜κ°€ 끝났닀고 νŒλ‹¨ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 그리고 이후에 λ‚˜νƒ€λ‚œ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ₯Ό 보고 func()ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄ 버린닀. λ•Œλ¬Έμ— func()의 리턴값인 42λ₯Ό λ°›κ³  λ§ˆμ§€λ§‰μ— 남겨진 ()λ₯Ό λ°›μ•„ 42(); 의 ν˜•νƒœκ°€ λœλ‹€. ν•˜μ§€λ§Œ 42λŠ” μˆ«μžμ΄λ―€λ‘œ μœ„μ™€ 같은 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

λ”°λΌμ„œ, λ§Žμ€ μžλ°”μŠ€ν¬λ¦½νŠΈ κ°€μ΄λ“œμ—μ„œλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹ λ°©μ‹μ—μ„œμ˜ μ„Έλ―Έμ½œλ‘  μ‚¬μš©μ„ κ°•λ ₯ν•˜κ²Œ κΆŒκ³ ν•œλ‹€.

Top

4.1.4 Function() μƒμ„±μž ν•¨μˆ˜λ₯Ό ν†΅ν•œ ν•¨μˆ˜ μƒμ„±ν•˜κΈ°

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” **Function()**μ΄λΌλŠ” κΈ°λ³Έ λ‚΄μž₯ μƒμ„±μž ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λœ 객체라고 볼수 μžˆλ‹€. λ¦¬ν„°λŸ΄λ‘œ μ„ μ–Έν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜ μ—­μ‹œ, λ‚΄λΆ€μ μœΌλ‘œλŠ” Function() μƒμ„±μž ν•¨μˆ˜λ‘œ ν•¨μˆ˜κ°€ μƒμ„±λœλ‹€κ³  λ³Ό 수 μžˆλ‹€.

Function() μƒμ„±μž ν•¨μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 문법

new Function( arg1, arg2, ..., argN, functionBody )

  • arg1, arg2, ..., argN: ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜
  • functionBody: ν•¨μˆ˜κ°€ 호좜될 λ•Œ 싀행될 μ½”λ“œλ₯Ό ν¬ν•¨ν•œ λ¬Έμžμ—΄
// Function() μƒμ„±μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ add() ν•¨μˆ˜ 생성
var add = new Function( 'x', 'y', 'return x + y' );
console.log( add( 3, 4 ) );    // (좜λ ₯κ°’) 7

μ°Έκ³ : μƒμ„±μž ν•¨μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 방법은 일반적으둜 자주 μ‚¬μš©λ˜λŠ” 기법은 μ•„λ‹ˆλ‹€.

Top

4.1.5 ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

μ„Έ κ°€μ§€ λ°©μ‹μ˜ ν•¨μˆ˜ μƒμ„±λ°©λ²•μ—λŠ” 각각 λ™μž‘ 방식에 μ•½κ°„μ˜ 차이가 μžˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ Guru인 λ”κΈ€λŸ¬μŠ€ ν¬λ½ν¬νŠΈλŠ” ν•¨μˆ˜ 생성에 μžˆμ–΄, ν•¨μˆ˜ ν‘œν˜„μ‹λ§Œμ„ μ‚¬μš©ν•  것을 κΆŒν•œλ‹€. κ·Έ 이유 쀑 ν•˜λ‚˜κ°€ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… λ•Œλ¬Έμ΄λ‹€.

// ν•¨μˆ˜ μ„ μ–Έλ¬Έ 방식과 ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…
add( 2, 3 );    // 5

// ν•¨μˆ˜ μ„ μ–Έλ¬Έ ν˜•νƒœλ‘œ add() ν•¨μˆ˜ μ •μ˜
function add(x, y) {
    return x + y;
}

add( 3, 4 );    // 7
  1. add( 2, 3 )이 ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— add ν•¨μˆ˜λŠ” μ •μ˜λ˜μ§€ μ•Šμ€ μƒνƒœμ΄λ‹€. ν•˜μ§€λ§Œ ν˜ΈμΆœν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. ν•¨μˆ˜ μ„ μ–Έλ¬Έ ν˜•νƒœλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ˜ μœ νš¨λ²”μœ„λŠ” μ½”λ“œμ˜ 맨 μ²˜μŒλΆ€ν„° μ‹œμž‘ν•œλ‹€λŠ” 것을 ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… 이라고 λΆ€λ₯Έλ‹€.
// ν•¨μˆ˜ ν‘œν˜„μ‹ 방식과 ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…
add( 2, 3 )    // uncaught type error

// ν•¨μˆ˜ ν‘œν˜„μ‹ ν˜•νƒœλ‘œ add() ν•¨μˆ˜ μ •μ˜
var add = function (x, y) {
    return x + y;
};

add( 3, 4 );    // 7
  1. μ—¬κΈ°μ„œλŠ” addκ°€ ν•¨μˆ˜ ν‘œν˜„μ‹ ν˜•νƒœλ‘œ μ •μ˜λ˜μ–΄ μžˆμ–΄μ„œ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.

μ΄λŸ¬ν•œ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ€ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° 전에 λ°˜λ“œμ‹œ μ„ μ–Έν•΄μ•Ό ν•œλ‹€λŠ” κ·œμΉ™μ„ λ¬΄μ‹œν•˜λ―€λ‘œ μ½”λ“œ ꡬ쑰λ₯Ό μ—‰μ„±ν•˜κ²Œ λ§Œλ“€μˆ˜ μžˆλ‹€κ³  μ§€μ λœλ‹€. ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ˜ 원인은 μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ³€μˆ˜μƒμ„±, μ΄ˆκΈ°ν™”μ˜ μž‘μ—…μ΄ λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ˜κΈ° λ•Œλ¬ΈμœΌλ‘œ 5μž₯μ—μ„œ 닀룬닀.

Top

4.2 ν•¨μˆ˜ 객체: ν•¨μˆ˜λ„ 객체닀

Top

4.2.1 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ„ 객체닀

function add(x, y) {
    return x+y;
}

add.result = add(3,2); //5
add.status='OK'        //OK

일반 객체처럼 result 와 status ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•˜λŠ”κ²Œ κ°€λŠ₯ν•˜λ‹€.

Top

4.2.2 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λŠ” κ°’μœΌλ‘œ μ·¨κΈ‰λœλ‹€.

  1. λ¦¬ν„°λŸ΄μ— μ˜ν•΄ 생성
  2. λ³€μˆ˜λ‚˜ λ°°μ—΄μ˜ μš”μ†Œ, 객체의 ν”„λ‘œνΌν‹° 등에 ν• λ‹Ή κ°€λŠ₯
  3. ν•¨μˆ˜μ˜ 인자둜 전달가λŠ₯
  4. ν•¨μˆ˜μ˜ λ¦¬ν„΄κ°’μœΌλ‘œ 리턴 κ°€λŠ₯
  5. 동적 ν”„λ‘œνΌν‹°λ₯Ό 생성 및 ν• λ‹Ή κ°€λŠ₯

μΌκΈ‰κ°μ²΄λž€?

Top

4.2.2.1 λ³€μˆ˜λ‚˜ ν”„λ‘œνΌν‹°μ˜ κ°’μœΌλ‘œ ν• λ‹Ή

var foo = 1000;
var bar = function() = { return 100; };

var obj = {};
obj.baz = function() { return 200; };

Top

4.2.2.2 ν•¨μˆ˜ 인자둜 전달

var foo = function(func) {
    func();
}
foo(function() {console.log('test');});

Top

4.2.2.3 λ¦¬ν„΄κ°’μœΌλ‘œ ν™œμš©

var foo = function() {
    return function() {
        console.log('test');
    }
}

var bar = foo();
bar();

Top

4.2.3 ν•¨μˆ˜ 객체의 κΈ°λ³Έ ν”„λ‘œνΌν‹°

ν•¨μˆ˜λŠ” 객체이닀 ν•¨μˆ˜λŠ” 일반 객체와 λ‹€λ₯΄κ²Œ ν•¨μˆ˜λ§Œμ˜ ν‘œμ€€ ν”„λ‘œνΌν‹°κ°€ μ •μ˜λ˜μ–΄ μžˆλ‹€.

Top ####4.2.3.1. length ν•¨μˆ˜κ°€ μ •μƒμ μœΌλ‘œ 싀행될 λ•Œ κΈ°λŒ€λ˜λŠ” 인자의 개수

function func1(x){
    return x;
}

function func2(x, y) {
    return x + y;
}

console.log('func1.length - ' + func1.length ); // (좜λ ₯κ°’) func1.length - 1
console.log('func2.length - ' + func2.length ); // (μΆœλŸ­κ°’) func2.length - 2

Top ####4.2.3.2. prototype ν”„λ‘œνΌν‹° constructor ν”„λ‘œνΌν‹° ν•˜λ‚˜λ§Œ μžˆλŠ” 객체

prototype ν”„λ‘œνΌν‹°μ˜ constructor ν”„λ‘œνΌν‹°λŠ” μžμ‹ κ³Ό μ—°κ²°λœ ν•¨μˆ˜λ₯Ό 가리킨닀.

즉, ν•¨μˆ˜μ˜ prototype ν”„λ‘œνΌν‹°λŠ” ν”„λ‘œν† νƒ€μž… 객체λ₯Ό 가리킀고, ν”„λ‘œν† νƒ€μž… 객체의 constructor ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜ 객체λ₯Ό 가리킨닀.

function func1(){
    return true;
}

console.dir(func1.prototype.constructor); // (좜λ ₯κ°’) constructor : function func1()

Top ####4.2.3.3. κ·Έ μ™Έ κΈ°λ³Έ ν”„λ‘œνΌν‹°

  • name : ν•¨μˆ˜ 이름

  • caller : μžμ‹ μ„ ν˜ΈμΆœν•œ ν•¨μˆ˜

  • arguments : μΈμžκ°’

  • proto : λΆ€λͺ¨ 역할을 ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 객체

Top

4.3 ν•¨μˆ˜μ˜ λ‹€μ–‘ν•œ ν˜•νƒœ

Top

4.3.1 μ½œλ°±ν•¨μˆ˜

ν•¨μˆ˜μ΄λ¦„μ€ 선택사항이닀. (λΆ™μ—¬λ„λ˜κ³  μ•ˆλΆ™μ—¬λ„ 됨) μ½œλ°±ν•¨μˆ˜λŠ” 읡λͺ…ν•¨μˆ˜μ˜ λŒ€ν‘œμ μΈ μš©λ„ 쀑 ν•˜λ‚˜μ΄λ‹€.

λŒ€ν‘œμ μΈ μ½œλ°±ν•¨μˆ˜μ˜ μ‚¬μš© 예

  • 이벀트 ν•Έλ“€λŸ¬ 처리: μ›ΉνŽ˜μ΄μ§€ λ‘œλ“œ, ν‚€λ³΄λ“œ μž…λ ₯λ“±μ˜ DOM μ΄λ²€νŠΈκ°€ λ°œμƒν•  경우 DOMμ΄λ²€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” 이벀트 ν•Έλ“€λŸ¬λ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.
//window.onload 이벀트 ν•Έλ“€λŸ¬ 예제 μ½”λ“œ
<!DOCTYPE html>
<html><body>
  <script>
    // νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ 호좜될 콜백 ν•¨μˆ˜
    window.onload = function() {
      alert('this is the callback function');
    };
  </script>
</body></html>
  • μœ„ μ˜ˆμ œμ½”λ“œλŠ”, μ›ΉνŽ˜μ΄μ§€κ°€ λ‘œλ”© 될 λ•Œ 경고창이 뜨게 λœλ‹€.

Top

4.3.2 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

ν•¨μˆ˜λ₯Ό μ •μ˜ν•¨κ³Ό λ™μ‹œμ— λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λΌκ³  λ§ν•œλ‹€.

(function (name) {
  console.log('This is the immediate function -> ' + name);
})('foo');

// κ²°κ³Ό: This is the immediate function -> foo
  • μ΄λŸ¬ν•œ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ”, 같은 ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λ‹€.
  • 졜초 ν•œλ²ˆμ˜ μ‹€ν–‰λ§Œμ„ ν•„μš”λ‘œν•˜λŠ” μ΄ˆκΈ°ν™” μ½”λ“œμ— μ‚¬μš©λ  수 μžˆλ‹€.

jQuery와 같은 라이브러리, ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” μ†ŒμŠ€μ½”λ“œ 전체가 μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜λ‘œ 감싸져 μžˆλ‹€.

// jQueryμ—μ„œ μ‚¬μš©λœ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function( window, undefined ) {
...
})( window );

μ΄λ ‡κ²Œ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” ν•¨μˆ˜ 유효 λ²”μœ„ νŠΉμ„± λ•Œλ¬Έμ΄λ‹€.

기본적으둜 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•  경우, μ „μ—­ 유효 λ²”μœ„λ₯Ό κ°€μ§€κ²Œ λœλ‹€. ν•¨μˆ˜ 내에 μ„ μ–Έλœ λ³€μˆ˜λ“€μ€ ν•¨μˆ˜ 유효 λ²”μœ„λ₯Ό κ°€μ§„λ‹€.

λ”°λΌμ„œ, λΌμ΄λΈŒλŸ¬λ¦¬κ°™μ΄ λ²”μš©μ μœΌλ‘œ μ‚¬μš© 될 μ½”λ“œμ—μ„œ μ „μ—­ 유효 λ²”μœ„μ˜ λ³€μˆ˜λ₯Ό μ§€μ •ν•˜κ²Œ 되면 λ¬Έμ œκ°€ μžˆμ„ 수 있기 λ•Œλ¬Έμ—, μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‚΄μ— 라이브러리 μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ λΌμ΄λΈŒλŸ¬λ¦¬κ°„ λ³€μˆ˜ 이름 좩돌 문제λ₯Ό λ°©μ§€ν•  수 μžˆλ‹€.

유λͺ… 라이브러리의 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ νŒ¨ν„΄

// Underscroe 1.3.3 Library
(function() {
  var root = this;
  var previousUnderscore = root._;
  ....
  var _ = function(obj) { return new wrapper( obj ); };
  ....
  root['_'] = _;
  ...
}).call( this );

call ν•¨μˆ˜λ₯Ό this μΈμžμ™€ ν•¨κ»˜ μ‚¬μš©λ˜μ—ˆλ‹€. μ¦‰μ‹œ μ‹€ν–‰ λ‚΄λΆ€μ˜ μ „μ—­ 객체인 this에 바인딩 되고, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ rootλΌλŠ” μ΄λ¦„μœΌλ‘œ μ‚¬μš©λœλ‹€.

// Sugar 1.2 Library (function(){ ... // Initialize buildObject(); buildString(); buildFunction() initializeClass(date); })();


> νŠΉλ³„ν•œ 인자 없이 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€. sugarμ—μ„œ μ œκ³΅ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ ν•¨μˆ˜λŠ” Object.prototypeμ΄λ‚˜ Function.prototype λ“± 기쑴에 μžˆλŠ” 객체에 λ“€μ–΄κ°€λ―€λ‘œ, νŠΉλ³„νžˆ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•˜λ‹€.


[Top](#_top)
<a name="ch04.3.3"/>
### 4.3.3 λ‚΄λΆ€ ν•¨μˆ˜

ν•¨μˆ˜ μ½”λ“œ 내뢀에 μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό **λ‚΄λΆ€ ν•¨μˆ˜**라고 ν•œλ‹€.
**λ‚΄λΆ€ ν•¨μˆ˜**λŠ”, ν΄λ‘œμ €λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ λΆ€λͺ¨ ν•¨μˆ˜ μ½”λ“œμ—μ„œ μ™ΈλΆ€μ˜ 접근을 막고 독립적인 헬퍼 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©ν•œλ‹€.

```javascript
//λ‚΄λΆ€ ν•¨μˆ˜ 예제 μ½”λ“œ

//parent() ν•¨μˆ˜ μ •μ˜
function parent() {
    var a = 100;
    var b = 200;

    // child() λ‚΄λΆ€ ν•¨μˆ˜ μ •μ˜
    function child() {
        var b = 300;
        console.log( a );
        console.log( b );
    }
    child();
}
parent();
child();

//좜λ ₯κ²°κ³Ό
//100
//300
//Uncaught ReferenceError: child is not defined

λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œλŠ” μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό λΆ€λͺ¨ ν•¨μˆ˜μ˜ λ³€μˆ˜μ— 접근이 κ°€λŠ₯ν•˜λ‹€.

  • child λ‚΄λΆ€ν•¨μˆ˜μ— λ³€μˆ˜ a개 μ„ μ–Έλ˜μ§€ μ•Šμ•˜μ§€λ§Œ, parent() ν•¨μˆ˜μ˜ λ³€μˆ˜ a에 μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
  • λ³€μˆ˜ bλŠ” child() ν•¨μˆ˜μ— μ„ μ–Έλ˜μ–΄ μžˆμœΌλ―€λ‘œ, child() ν•¨μˆ˜μ˜ bλ₯Ό μ°Έκ³ ν–ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μŠ€μ½”ν”„ 체이닝 μžμ„Έν•œ λ‚΄μš©μ€ 5μž₯μ—μ„œ μ„€λͺ…ν•œλ‹€. λ‚΄λΆ€ ν•¨μˆ˜λŠ” μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό μ™ΈλΆ€ν•¨μˆ˜μ˜ λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€

λ‚΄λΆ€ ν•¨μˆ˜λŠ” 일반적으둜 μžμ‹ μ΄ μ •μ˜λœ λΆ€λͺ¨ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ 호좜이 κ°€λŠ₯ν•˜λ‹€.

  • parent() ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ child()ν•¨μˆ˜μ˜ ν˜ΈμΆœμ„ μ‹œλ„ν•˜μ§€λ§Œ ν•¨μˆ˜κ°€ μ •μ˜λ˜μ§€ μ•Šμ•˜λ‹€λŠ” μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

ν•¨μˆ˜ μŠ€μ½”ν”„ ν•¨μˆ˜ μŠ€μ½”ν”„ λ°–μ—μ„œλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„ μ•ˆμ— μ„ μ–Έλœ λͺ¨λ“  λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€. ν•¨μˆ˜ μŠ€μ½”ν”„ μ•ˆμ˜ μ„ μ–Έλœ λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλŠ” 방법이 μžˆλŠ”λ°, λΆ€λͺ¨ν•¨μˆ˜μ—μ„œ λ‚΄λΆ€ν•¨μˆ˜λ₯Ό μ™ΈλΆ€λ‘œ λ¦¬ν„΄ν•œλ‹€λ©΄ λΆ€λͺ¨ ν•¨μˆ˜ λ°–μ—μ„œλ„ λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

//ν•¨μˆ˜ μŠ€μ½”ν”„ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€ ν•¨μˆ˜ ν˜ΈμΆœν•˜λŠ” 예제 μ½”λ“œ

function parent() {
  var a = 100l
  // child() λ‚΄λΆ€ν•¨μˆ˜
  var child = function() {
    console.log( a );
    }
  
  //child() ν•¨μˆ˜ λ°˜ν™˜
  return child;
}

var inner = parent();
inner();

//좜λ ₯κ²°κ³Ό
//100

싀행이 λλ‚œ parent() ν•¨μˆ˜μ˜ λ‚΄λΆ€ λ³€μˆ˜μΈ aλ₯Ό μ°Έμ‘°ν•˜μ—¬ 100이 좜λ ₯λ˜μ—ˆλŠ”λ°, 이처럼 μ‚¬μš©λ˜λŠ” inner()같은 ν•¨μˆ˜λ₯Ό ν΄λ‘œμ € 라고 ν•œλ‹€.

Top

4.3.4 ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ„ 일급 κ°μ²΄μ΄λ―€λ‘œ, ν•¨μˆ˜ 자체λ₯Ό 리턴할 수 μžˆλ‹€.

//μžμ‹ μ„ μž¬μ •μ˜ν•˜λŠ” ν•¨μˆ˜ 예제 μ½”λ“œ

//self() ν•¨μˆ˜
var self = function () {
  console.log('a');
  return function() {
    console.log('b');
  }
}
self = self();  // a
self();         // b
  1. μ²˜μŒμ— self()κ°€ 호좜될 λ•Œ, aκ°€ 좜λ ₯λœλ‹€. 그리고 λ‹€μ‹œ return으둜 μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό μ €μž₯ν•œλ‹€.
  2. λ‘λ²ˆμ§Έλ‘œ, self()κ°€ 호좜되면 bκ°€ 좜λ ₯λœλ‹€.

Top

4.4 ν•¨μˆ˜ 호좜과 this

c/c++κ³ΌλŠ” λ‹€λ₯΄κ²Œ μ—„κ²©ν•œ λ¬Έλ²•ν˜ΈμΆœμ„ ν•˜μ§€ μ•Šμ•„ ν•¨μˆ˜ 호좜 μžμ²΄κ°€ μžμœ λ‘­λ‹€.

Top

4.4.1 arguments 객체

c/c++κ³ΌλŠ” 달리, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ ν•¨μˆ˜ ν˜•μ‹μ— 맞좰 인자λ₯Ό λ„˜κ²¨μ£Όμ§€ μ•Šλ”λΌλ„ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

function func(arg1, arg2) {
  console.log(arg1, arg2);
}

func();       //(좜λ ₯) undefined undefined
func(1);      //(좜λ ₯) 1 undefined
func(1,2);    //(좜λ ₯) 1 2
func(1,2,3);  //(좜λ ₯) 1 2
  • ν•¨μˆ˜μ˜ μΈμžλ³΄λ‹€ 적게 ν˜ΈμΆœν•  경우, undefinedκ°€ ν• λ‹Ήλœλ‹€.
  • μΈμžλ³΄λ‹€ 많이 ν˜ΈμΆœν•  경우, 초과된 μΈμˆ˜λŠ” λ¬΄μ‹œλœλ‹€.
  • μ΄λ ‡κ²Œ λ„˜κ²¨μ€€ μΈμžλ“€μ€ arguments 객체에 μœ μ‚¬ λ°°μ—΄ 객체 ν˜•νƒœλ‘œ μ €μž₯λ˜μ–΄ λ„˜κ²¨μ§„λ‹€.
//arguments 객체 예제 μ½”λ“œ

//add() ν•¨μˆ˜
function add(a,b) {
  //arguments 객체 좜λ ₯
  console.dir(arguments);
  return a+b;
}

console.log(add(1));      //(좜λ ₯) NaN
console.log(add(1,2));    //(좜λ ₯) 3
console.log(add(1,2,3));  //(좜λ ₯) 3

console.dir(arguments) ν¬λ‘¬μ—μ„œ 좜λ ₯λ˜λŠ” κ²°κ³Ό ch04-15

λ‹€μ‹œλ§ν•˜μ§€λ§Œ, arguemtntsλŠ” 객체이닀. 배열이 μ•„λ‹ˆλ‹€. μœ μ‚¬ 객체 λ°°μ—΄μ—μ„œ λ°°μ—΄ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법은 4.4.2.4 callκ³Ό apply λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•œ λͺ…μ‹œμ μΈ this λ°”μΈλ”©μ—μ„œ μ•Œμ•„λ³Έλ‹€.

//arguments 객체의 μ‚¬μš© 예

function sum() {
  var resule = 0;

  for(var i=0; i < arguemnts.length; i++){
    result += arguments[i];
  }
  return result;
}

console.log(sum(1,2,3));              //(좜λ ₯) 6
console.log(sum(1,2,3,4,5,6,7,8,9));  //(좜λ ₯) 45

Top

4.4.2 호좜 νŒ¨ν„΄κ³Ό this 바인딩

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, arguemnts 객체와 this μΈμžκ°€ μ•”λ¬΅μ μœΌλ‘œ μ „λ‹¬λœλ‹€. ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 방식(ν˜ΈμΆœλ°©μ‹)에 λ”°λΌμ„œ thisκ°€ λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°(this바인딩)ν•˜κΈ° λ•Œλ¬Έμ— thisλ₯Ό μ΄ν•΄ν•˜λŠ” 것이 μ–΄λ ΅λ‹€.

Top

4.4.2.1 객체의 λ©”μ„œλ“œ ν˜ΈμΆœν•  λ•Œ this 바인딩

λ©”μ„œλ“œ λ‚΄λΆ€ μ½”λ“œμ—μ„œ μ‚¬μš©λœ thisλŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 객체둜 λ°”μΈλ”©λœλ‹€.

//λ©”μ„œλ“œ 호좜 μ‚¬μš© μ‹œ this 바인딩

// myObject 객체 생성
var myObject = {
  name: 'foo',
  sayName: function() {
    console.log(this.name);
  }
};

//otherObject 객체 생성
var otherObject = {
  name: 'bar'
}

// otherObject.sayName() λ©”μ„œλ“œ
otherObjet.sayName = myObject.sayName;

myObject.sayName();
otherObject.sayName();

//좜λ ₯κ²°κ³Ό
//foo
//bar

μœ„μ˜ μ˜ˆμ œμ—μ„œ λ³΄λ‹€μ‹œν”Ό thisλŠ” μžμ‹ μ„ ν˜ΈμΆœν•œ 객체에 바인딩 λœλ‹€.

Top

4.4.2.2 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ this 바인딩

ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λœ thisλŠ” μ „μ—­ 객체에 λ°”μΈλ”©λœλ‹€. λΈŒλΌμš°μ €μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ” 경우, μ „μ—­κ°μ²΄λŠ” window 객체가 λœλ‹€.

μ „μ—­ κ°μ²΄λž€ 무엇인가?? (λΈŒλΌμš°μ €, Node.js)

λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ” 경우, μ „μ—­κ°μ²΄λŠ” window 객체가 λœλ‹€. Node.js같은 μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ μ „μ—­κ°μ²΄λŠ” global 객체가 λœλ‹€.

// μ „μ—­ 객체와 μ „μ—­ λ³€μˆ˜μ˜ 관계λ₯Ό λ³΄μ—¬μ£ΌλŠ” 예제 μ½”λ“œ

var foo = "I'm foo";  // μ „μ—­λ³€μˆ˜ μ„ μ–Έ

console.log(foo);         //(좜λ ₯) I'm foo
console.log(window.foo);  //(좜λ ₯) I'm foo

λ”°λΌμ„œ μ „μ—­λ³€μˆ˜λŠ” μ „μ—­ 객체(window)의 ν”„λ‘œνΌν‹°λ‘œλ„ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

// ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ this 바인딩을 λ³΄μ—¬μ£ΌλŠ” 예제 μ½”λ“œ

var test = 'This is test';
console.log(window.test);

//sayFoo() ν•¨μˆ˜
var sayFoo = function(){
  console.log(this.test);   // sayFoo() ν•¨μˆ˜ 호좜 μ‹œ thisλŠ” μ „μ—­ 객체에 λ°”μΈλ”©λœλ‹€.
}

//좜λ ₯κ²°κ³Ό
//This is test
//This is test
  1. μš°μ„  testλΌλŠ” μ „μ—­λ³€μˆ˜λŠ” 전역객체 window ν”„λ‘œνΌν‹°λ‘œ 접근이 κ°€λŠ₯ν•˜λ‹€.
  2. sayFoo()ν•¨μˆ˜μ—μ„œ thisλŠ” 전역객체 window에 λ°”μΈλ”©λœλ‹€. λ”°λΌμ„œ this.test λŠ” window.testλ₯Ό μ˜λ―Έν•œλ‹€.

이같은 νŠΉμ„±μ€ λ‚΄λΆ€ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆμ„ κ²½μš°μ—λ„ λ™μΌν•˜λ‹€. κ·Έλž˜μ„œ, λ‚΄λΆ€ν•¨μˆ˜μ—μ„œ thisλ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

// λ‚΄λΆ€ν•¨μˆ˜μ˜ this 바인딩 λ™μž‘μ„ λ³΄μ—¬μ£ΌλŠ” 예제 μ½”λ“œ

// μ „μ—­λ³€μˆ˜ value μ •μ˜
var value = 100;

//myObject 객체 생성
var myObject = {
  value:1,
  func1: function() {
    this.value += 1;
    console.log("func1() called. this.value : " + this.value);

    //func2 λ‚΄λΆ€ν•¨μˆ˜
    func2 = function() {
      this.value += 1;
      console.log("func2() called. this.value : " + this.value);

      //func3 λ‚΄λΆ€ν•¨μˆ˜
      func3 = function() {
        this.value += 1;
        console.log("func3() called. this.value : " + this.value);
      }

      func3();     //func3() λ‚΄λΆ€ ν•¨μˆ˜ 호좜
    }

    func2();       //func2() λ‚΄λΆ€ ν•¨μˆ˜ 호좜
  }
};
myObject.func1();  //func1() λ©”μ„œλ“œ 호좜


//좜λ ₯κ²°κ³Ό
func1() called - this.value : 2
func2() called - this.value : 101
func3() called - this.value : 102

좜λ ₯κ²°κ³Όλ₯Ό 보면, func2(), func3() 의 κ²°κ³Όκ°€ μ˜λ„μ™€λŠ” λ‹€λ₯Έ 것을 λ³Ό 수 μžˆλ‹€. myObject.func1() 을 ν˜ΈμΆœν•˜λ©° thisλŠ” myObject에 λ°”μΈλ”©λ˜μ—ˆμ§€λ§Œ, λ‚΄λΆ€ν•¨μˆ˜λ“€μ˜ thisλŠ” 전역객체인 window에 λ§€ν•‘λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€. 그림으둜 보면 λ‹€μŒκ³Ό κ°™λ‹€.

ch04-17

ch04-18

이런 ν˜„μƒμ€ λ‹€μŒ μ½”λ“œμ²˜λŸΌ ν•΄κ²°ν•  수 μžˆλ‹€.

//λ‚΄λΆ€ ν•¨μˆ˜μ˜ this 바인딩 문제λ₯Ό ν•΄κ²°ν•œ 예제 μ½”λ“œ

var value = 100;

var myObject = {
  value: 1,
  func1: function() {
    var that = this;

    this.value += 1;
    console.log("func1() called. this.value : " + this.value);

    func2 = function() {
      that.value += 1;
      console.log("func2() called. this.value : " + that.value);
    
      func3 = function() {
        that.value += 1;
        console.log("func3() called. this.value : " + that.value);
      }
      func3();
    }
    func2();
  }
};

myObject.func1();

that은 thisλ₯Ό λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 관둀적인 λ³€μˆ˜μ΄λ‹€.

Top

4.4.2.3 μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ this 바인딩

μƒμ„±μž ν•¨μˆ˜: κΈ°μ‘΄ ν•¨μˆ˜μ— new μ—°μ‚°μžλ₯Ό λΆ™μ—¬μ„œ 호좜 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λͺ¨λ“  ν•¨μˆ˜λ₯Ό μƒμ„±μž ν•¨μˆ˜λ‘œ μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ, μƒμ„±μž ν•¨μˆ˜λ‘œ μ •μ˜ν•˜μ—¬ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜μ˜ 경우 ν•¨μˆ˜μ΄λ¦„μ˜ 첫 문자λ₯Ό λŒ€λ¬Έμžλ‘œ μ“°κΈ°λ₯Ό ꢌμž₯ν•˜κ³  μžˆλ‹€.

μƒμ„±μž ν•¨μˆ˜κ°€ λ™μž‘ν•˜λŠ” 방식

μƒμ„±μžν•¨μˆ˜κ°€ 호좜될 λ•Œ, λ™μž‘ν•˜λŠ” 방식은 μ•½κ°„ λ‹€λ₯΄λ‹€. λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ λ™μž‘ν•˜κ²Œ λœλ‹€.

  1. 빈 객체 생성 및 this 바인딩

빈 객체가 μƒμ„±λ˜λ©°, this둜 바인딩 λœλ‹€. 이 빈 κ°μ²΄λŠ” μƒμ„±μž ν•¨μˆ˜μ˜ prototype ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” 객체λ₯Ό μžμ‹ μ˜ ν”„λ‘œν† νƒ€μž… 객체둜 μ„€μ •ν•œλ‹€.

  1. thisλ₯Ό ν†΅ν•œ ν”„λ‘œνΌν‹° 생성
  1. μƒμ„±λœ 객체 리턴

리턴문이 λ™μž‘ν•˜λŠ” 방식은 κ²½μš°μ— 따라 λ‹€λ₯΄λ‹€. 일반적으둜 리턴문이 μ—†λŠ” 경우, this둜 바인딩 된 μƒˆλ‘œ μƒμ„±ν•œ 객체가 λ¦¬ν„΄λœλ‹€. ν•˜μ§€λ§Œ μΌλ°˜ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ, 리턴값이 λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ undefinedκ°€ λ¦¬ν„΄λœλ‹€. 4.4.3 ν•¨μˆ˜ λ¦¬ν„΄μ—μ„œ μžμ„Ένžˆ μ•Œμ•„λ³Έλ‹€.

//μƒμ„±μž ν•¨μˆ˜μ˜ λ™μž‘ 방식

//Person() μƒμ„±μž ν•¨μˆ˜
var Person = function( name );
  // ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ μ „
  this.name = name;
  // ν•¨μˆ˜ 리턴
}

//foo 객체 생성
var foo = new Person('foo');
console.log( foo.name );     //(좜λ ₯) foo

ch04-20

객체 λ¦¬ν„°λŸ΄ 방식과 μƒμ„±μž ν•¨μˆ˜λ₯Ό ν†΅ν•œ 객체 생성 λ°©μ‹μ˜ 차이 객체 λ¦¬ν„°λŸ΄:

  • μ •ν•΄μ§„ ν˜•μ‹μœΌλ‘œ 밖에 λ§Œλ“€ 수 μ—†μŒ
  • ν”„λ‘œν† νƒ€μž… 객체(proto ν”„λ‘œνΌν‹°)λŠ” Object이닀.

μƒμ„±μž ν•¨μˆ˜:

  • 인자λ₯Ό λ°›μ•„ μ—¬λŸ¬κ°œμ˜ 객체λ₯Ό λ‹€λ₯Έ ν˜•μ‹μœΌλ‘œ λ§Œλ“€ 수 있음
  • ν”„λ‘œν† νƒ€μž… 객체(proto ν”„λ‘œνΌν‹°)λŠ” μƒμ„±μž ν•¨μˆ˜μ˜ prototype ν”„λ‘œνΌν‹°κ°€ λœλ‹€. (μœ„μ˜ μ˜ˆμ œμ—μ„œ Person)

μƒμ„±μž ν•¨μˆ˜λ₯Ό newλ₯Ό 뢙이지 μ•Šκ³  호좜 ν•  경우

μΌλ°˜ν•¨μˆ˜λ‘œ ν˜ΈμΆœμ΄λœλ‹€. μΌλ°˜ν•¨μˆ˜λŠ”, this의 바인딩 방식이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— window μ „μ—­ 객체에 바인딩 λœλ‹€.

//newλ₯Ό 뢙이지 μ•Šκ³  μƒμ„±μž ν•¨μˆ˜ ν˜ΈμΆœμ‹œμ˜ 였λ₯˜

var qux = Person('qux', 20, man);
console.log( qux );          //(좜λ ₯) undefined
console.log(window.name);    //(좜λ ₯) qux
console.log(window.age);     //(좜λ ₯) 20
console.log(window.gender);  //(좜λ ₯) man

κ°•μ œλ‘œ μΈμŠ€ν„΄μŠ€ μƒμ„±ν•˜κΈ°

μƒμ„±μž ν•¨μˆ˜λ₯Ό 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•˜λŠ” μ‹€μˆ˜λ₯Ό ν”Όν•˜λ €κ³  μ‚¬μš©λ˜λŠ” νŒ¨ν„΄μ΄ μžˆλ‹€.

function A(arg) { if( !( this instance A ) ) return new A( arg ); this.value = arg ? arg : 0; } // λ˜λŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš© ν•œλ‹€. if( !( this instance arguments.callee ) ) ...


> arguments.calleeκ°€ λ°”λ‘œ ν•¨μˆ˜ 이름을 λ‚˜νƒ€λ‚΄λ―€λ‘œ, μœ„μ˜ μ½”λ“œμ™€ μ•„λž˜μ˜ μ½”λ“œλŠ” 같은 μ˜λ―Έμ΄λ‹€.

[Top](#_top)
<a name="ch04.4.2.4"/>
#### 4.4.2.4 callκ³Ό apply λ©”μ„œλ“œλ₯Ό μ΄μš©ν•œ λͺ…μ‹œμ μΈ this 바인딩

thisλ₯Ό νŠΉμ • 객체에 **λͺ…μ‹œμ μœΌλ‘œ 바인딩** μ‹œν‚€λŠ” 방법도 μžˆλ‹€.

1. apply(thisArg, argArray)
1. call(thisArg, arg1, arg2, arg3, ...)

apply와 call λ©”μ„œλ“œλŠ” κΈ°λŠ₯은 κ°™μœΌλ‚˜, 인자λ₯Ό λ„˜κ²¨λ°›λŠ” κ²ƒμ—μ„œ 차이가 μžˆμ„ 뿐이닀.

```javascript
// apply와 call의 λͺ…μ‹œμ  this 바인딩

function Person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}

var foo = {};  // 빈객체

Person.apply( foo, ['foo', 30, 'man'] );

Person.call( foo, 'foo', 30, 'man' );

μœ„μ˜ μ½”λ“œλŠ” thisλ₯Ό foo 객체에 λͺ…μ‹œμ μœΌλ‘œ λ°”μΈλ”©ν•˜κ²Œ λœλ‹€.

apply λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ arguments 객체λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•˜κΈ°.

function myFunction() { var args = Array.prototype.slice.apply( arguments ); // Array.prototype.slice() λ©”μ„œλ“œλ₯Ό 호좜 ν•˜λ˜, μ΄λ•Œ thisλŠ” arguments 객체둜 λ°”μΈλ”©ν•˜λΌ. }


[Top](#_top)
<a name="ch04.4.3"/>
### 4.4.3 ν•¨μˆ˜ 리턴

[Top](#_top)
<a name="ch04.4.3.1"/>
#### 4.4.3.1 κ·œμΉ™ 1) 일반 ν•¨μˆ˜λ‚˜ λ©”μ„œλ“œλŠ” 리턴값을 μ§€μ •ν•˜μ§€ μ•Šμ„ 경우, undefined 값이 λ¦¬ν„΄λœλ‹€.

[Top](#_top)
<a name="ch04.4.3.2"/>
#### 4.4.3.2 κ·œμΉ™ 2) μƒμ„±μž ν•¨μˆ˜μ—μ„œ 리턴값을 μ§€μ •ν•˜μ§€ μ•Šμ„ 경우 μƒμ„±λœ 객체가 λ¦¬ν„΄λœλ‹€.

μƒμ„±μžν•¨μˆ˜μ—μ„œλŠ” 리턴값을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, this둜 λ°”μΈλ”©λœ μƒˆλ‘œ μƒμ„±λœ 객체가 λ¦¬ν„΄λœλ‹€. ν•˜μ§€λ§Œ λ‹€μŒμ˜ λͺ‡κ°€μ§€ μ˜ˆμ™Έμ‚¬ν•­μ΄ μžˆλ‹€.

- λͺ…μ‹œμ μœΌλ‘œ λ‹€λ₯Έ 객체λ₯Ό 리턴할 경우
```javascript
function Person(name, age, gender){
  this.name = name;
  this.age = age;
  this.gender = gender;

  //λͺ…μ‹œμ μœΌλ‘œ λ‹€λ₯Έ 객체λ₯Ό 리턴
  return {name:'bar', age:20, gender: 'woman'};
}
var foo = new Person( 'foo', 30, 'man' );

이 경우, fooμ—λŠ” bar, 20, woman 객체가 λ¦¬ν„΄λœλ‹€.

  • μƒμ„±μž ν•¨μˆ˜μ˜ 리턴값이 객체가 μ•„λ‹Œ 뢈린, 숫자, λ¬Έμžμ—΄μ˜ 경우

이 경우, 리턴값을 λ¬΄μ‹œν•˜κ³  this둜 바인딩 된 객체가 λ¦¬ν„΄λœλ‹€.

Top

4.5 ν”„λ‘œν† νƒ€μž… 체이닝

### 4.5.1 ν”„λ‘œν† νƒ€μž…μ˜ 두 κ°€μ§€ 의미
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” 클래슀 κ°œλ…μ΄ μ—†λ‹€. λ‹€λ§Œ, μƒμ†μ˜ κ°œλ…μ€ μ‘΄μž¬ν•œλ‹€.
  • μƒμ†μ˜ κ°œλ…μ˜ λΆ€λͺ¨ κ°μ²΄λŠ” 'ν”„λ‘œν† νƒ€μž…' 객체이닀.
  • λΆ€λͺ¨μΈ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘° 링크 ν˜•νƒœμ˜ μˆ¨κ²¨μ§„ ν”„λ‘œνΌν‹°κ°€ 암묡적 ν”„λ‘œν† νƒ€μž… 링크이닀.
  • 암묡적 ν”„λ‘œν† νƒ€μž… λ§ν¬λŠ” Prototype ν”„λ‘œνΌν‹°μ— μ €μž₯되고, Prototype링크라고 λΆˆλ¦°λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체 생성 κ·œμΉ™ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ¨λ“  κ°μ²΄λŠ” μžμ‹ μ„ μƒμ„±ν•œ μƒμ„±μž ν•¨μˆ˜μ˜ prototype ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μžμ‹ μ˜ λΆ€λͺ¨κ°μ²΄λ‘œ μ„€μ •ν•˜λŠ” Prototype링크둜 μ—°κ²°ν•œλ‹€.

// Person μƒμ„±μž ν•¨μˆ˜
function Person(name){
  this.name = name;
}

// foo 객체 생성
var foo = new Person('foo');
  • Person() μƒμ„±μž ν•¨μˆ˜λŠ” prototype ν”„λ‘œνΌν‹°λ‘œ μžμ‹ κ³Ό 링크된 ν”„λ‘œν† νƒ€μž… 객체λ₯Ό 가리킨닀.
  • Person() μƒμ„±μž ν•¨μˆ˜λ‘œ μƒμ„±λœ foo κ°μ²΄λŠ” Person() ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό Prototype 링크둜 μ—°κ²°ν•œλ‹€.

ch04-23

ch04-24

Top

4.5.2 객체 λ¦¬ν„°λŸ΄ λ°©μ‹μœΌλ‘œ μƒμ„±λœ 객체의 ν”„λ‘œν† νƒ€μž… 체이닝

λΆ€λͺ¨μ—­ν• μ„ ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 객체의 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λŠ” 것을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 것이 ν”„λ‘œν† νƒ€μž… 체이닝 이닀.

객체 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ λͺ¨λ“  κ°μ²΄λŠ” Object()λΌλŠ” λ‚΄μž₯ μƒμ„±μž ν•¨μˆ˜λ‘œ μƒμ„±λœ 것이닀. λ”°λΌμ„œ, Object()ν•¨μˆ˜μ˜ prototype ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” Object.prototype 객체λ₯Ό μžμ‹ μ˜ ν”„λ‘œν† νƒ€μž… 객체둜 μ—°κ²°(prototype링크)ν•œλ‹€.

Top

4.5.3 μƒμ„±μž ν•¨μˆ˜λ‘œ μƒμ„±λœ 객체의 ν”„λ‘œν† νƒ€μž… 체이닝

객체 λ¦¬ν„°λŸ΄λ°©μ‹κ³Ό μ•½κ°„ λ‹€λ₯Έ 체이닝이 μ΄λ£¨μ–΄μ§€μ§€λ§Œ, λ‹€μŒμ˜ κΈ°λ³Έ 원칙을 잘 μ§€ν‚€κ³  μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ¨λ“  κ°μ²΄λŠ” μžμ‹ μ„ μƒμ„±ν•œ μƒμ„±μž ν•¨μˆ˜μ˜ prototypeν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” 객체λ₯Ό μžμ‹ μ˜ **ν”„λ‘œν† νƒ€μž… 객체(λΆ€λͺ¨κ°μ²΄)**둜 μ·¨κΈ‰ν•œλ‹€.

Person() μƒμ„±μž ν•¨μˆ˜μ˜ prototype ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” Person.prototype 객체가 있고. 이 객체 λ˜ν•œ Object.prototype을 Prototype링크둜 κ°€μ§€κ³  μžˆλ‹€.

Top

4.5.4 ν”„λ‘œν† νƒ€μž… μ²΄μ΄λ‹μ˜ 쒅점

Object.prototype 객체가 κ²°κ΅­ ν”„λ‘œν† νƒ€μž… μ²΄μ΄λ‹μ˜ 쒅점이닀.

Top

4.5.5 κΈ°λ³Έ 데이터 νƒ€μž… ν™•μž₯

  • Number.prototype : 숫자λ₯Ό μ‚¬μš©ν•˜λŠ” 객체의 ν”„λ‘œν† νƒ€μž…
  • String.prototype : λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜λŠ” 객체의 ν”„λ‘œν† νƒ€μž…
  • Array.prototype : 배열을 μ‚¬μš©ν•˜λŠ” 객체의 ν”„λ‘œν† νƒ€μž…
//String κΈ°λ³Ένƒ€μž…μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

String.prototype.testMethod = function() {
  console.log("This is the String.prototype.testMethod()");
};

var str = "This is test";
str.testMethod();

Top

4.5.6 ν”„λ‘œν† νƒ€μž…λ„ μžλ°”μŠ€ν¬λ¦½νŠΈ 객체닀.

ν”„λ‘œν† νƒ€μž… 객체도 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°μ²΄μ΄λ―€λ‘œ, 일반 객체처럼 ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€/μ‚­μ œν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

function Person(name) {
  this.name = name;
}

var foo = new Person('foo');

Person.prototype.sayHello = function(){
  console.log("hello");
}

foo.sayHello();   // hello

Top

4.5.7 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ™€ this 바인딩

ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ thisλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, 어디에 바인딩 될 것인가??

// ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ™€ this 바인딩

function Person(name) {
  this.name = name;
}

Person.prototype.getName = function() {
  return this.name;
};

var foo = new Person('foo');

console.log(foo.getName());   //(좜λ ₯) foo

// Person.prototype 객체에 name ν”„λ‘œνΌν‹° 동적 μΆ”κ°€
Person.prototype.name = 'person';

console.log(Person.prototype.getName());  //(좜λ ₯) person

ch04-31

Top

4.5.8 λ””ν΄νŠΈ ν”„λ‘œν† νƒ€μž…μ€ λ‹€λ₯Έ 객체둜 변경이 κ°€λŠ₯ν•˜λ‹€.

객체지ν–₯의 상속을 κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

function Person(name) {
  this.name = name;
}

console.log(Person.prototype.constructor);      //(좜λ ₯) Person(name)

var foo = new Person('foo');
console.log(foo.country);                       //(좜λ ₯) undefined

// λ””ν΄νŠΈ ν”„λ‘œν† νƒ€μž… 객체 λ³€κ²½
Person.prototype = {
  country: 'Korea'
};
console.log( Person.prototype.constructor );    //(좜λ ₯) Object();

var bar = new Person('bar');
console.log( foo.country );      //(좜λ ₯) undefined
console.log( bar.country );      //(좜λ ₯) Korea
console.log( foo.constructor );  //(좜λ ₯) Person(name)
console.log( bar.constructor );  //(좜λ ₯) Object()

ch04-32

Top

4.5.9 객체의 ν”„λ‘œνΌν‹° μ½κΈ°λ‚˜ λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•  λ•Œλ§Œ ν”„λ‘œν† νƒ€μž… 체이닝이 λ™μž‘ν•œλ‹€.

function Person(name){
  this.name = name;
}

Person.prototype.country = 'Korea';

var foo = new Person('foo');
var bar = new Person('bar');
console.log(foo.country);   //(좜λ ₯) Korea
console.log(bar.country);   //(좜λ ₯) Korea
foo.country = 'USA';

console.log(foo.country);   //(좜λ ₯) USA
console.log(bar.country);   //(좜λ ₯) Korea

ch04-33 Top

⚠️ **GitHub.com Fallback** ⚠️