μƒˆμ†Œμ‹

인기 검색어

TL

21/09/12 TL. μžλ°”μŠ€ν¬λ¦½νŠΈ - ν•¨μˆ˜(1)

  • -

πŸ‰ ν•¨μˆ˜λž€?

ν•¨μˆ˜ : 일련의 과정을 문으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ 것을 λ§ν•œλ‹€.

πŸ‰ ν•¨μˆ˜ λ¦¬ν„°λŸ΄

js의 ν•¨μˆ˜λŠ” 객체 νƒ€μž…μ˜ 값이닀. λ”°λΌμ„œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 μžˆλ‹€. 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€.

  • ν•¨μˆ˜κ°€ κ°μ²΄λΌλŠ” 사싀은 λ‹€λ₯Έ 언어와 κ΅¬λ³„λ˜λŠ” js의 νŠΉμ§•μ΄λ‹€.

πŸ‰ ν•¨μˆ˜ μ •μ˜

ν•¨μˆ˜ μ •μ˜ν•˜λŠ” 방법은 4가지가 μžˆλ‹€.

  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ
  • ν•¨μˆ˜ ν‘œν˜„μ‹
  • Function μƒμ„±μž ν•¨μˆ˜
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜

λͺ¨λ“  ν•¨μˆ˜ μ •μ˜ 방식은 ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€λŠ” 곡톡점이 μžˆμ§€λ§Œ μ€‘μš”ν•œ 차이가 μžˆλ‹€.

  • λ³€μˆ˜λŠ” μ„ μ–Έν•œλ‹€κ³  ν•˜κ³  ν•¨μˆ˜λŠ” μ •μ˜ν•œλ‹€κ³  ν‘œν˜„ν•œλ‹€. ν•œμˆ˜ 선언문이 ν‰κ°€λ˜λ©΄ μ‹λ³„μžκ°€ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λ˜κ³  ν•¨μˆ˜ 객체가 ν• λ‹Ήλœλ‹€.

πŸ₯₯ ν•¨μˆ˜ μ„ μ–Έλ¬Έ

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

// ν•¨μˆ˜ μ°Έμ‘°
// console.dir은 ν•¨μˆ˜ 객체의 ν”„λ‘œνΌν‹°κΉŒμ§€ 좜λ ₯ν•œλ‹€.
// Node.js ν™˜κ²½μ—μ„œλŠ” console.log와 같은 κ²°κ³Όκ°€ 좜λ ₯λœλ‹€.
console.dir(add); // f add(x, y)

// ν•¨μˆ˜ 호좜
console.log(add(2, 5));

ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μžˆμœΌλ‚˜ ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€. ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이닀. λ”°λΌμ„œ λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€. κ·Έλ ‡λ‹€λ©΄ λ‹€μŒκ³Ό 같은 μ½”λ“œλŠ” μ–΄λ–»κ²Œ κ°€λŠ₯ν•œ κ²ƒμΌκΉŒ?

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

console.log(add(2, 5));

μ΄λŠ” js 엔진이 μ½”λ“œμ˜ λ¬Έλ§₯에 따라 λ™μΌν•œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문법 μ„ μ–Έλ¬ΈμœΌλ‘œ ν•΄μ„ν•˜λŠ” κ²½μš°μ™€ ν‘œν˜„μ‹μΈ 문인 ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•΄μ„ν•˜λŠ” κ²½μš°κ°€ 있기 λ•Œλ¬Έμ΄λ‹€.

{}이 λ‹¨λ…μœΌλ‘œ μ‘΄μž¬ν•˜λ©΄ js엔진은 {}λ₯Ό λΈ”λ‘λ¬ΈμœΌλ‘œ ν•΄μ„ν•œλ‹€. λ§Œμ•½ 평가 λŒ€μƒ(ν”Όμ—°μ‚°μž)라면 객체 λ¦¬ν„°λŸ΄λ‘œ ν•΄μ„ν•œλ‹€.

// κΈ°λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ λ‹¨λ…μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ ν•΄μ„λœλ‹€.
// ν•¨μˆ˜ μ„ μ–Έλ¬Έμ—μ„œλŠ” ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€.
function foo() { console.log('foo'); }
foo(); // foo

// ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ ν”Όμ—°μ‚°μžλ‘œ μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ 선언문이 μ•„λ‹ˆλΌ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•΄μ„λœλ‹€.
// ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ—μ„œλŠ” ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μžˆλ‹€.
(function bar() { console.log('bar'); })
bar(); // ReferenceError : bar is not defined

ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λ°”λ”” λ‚΄μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžλ‹€. λ”°λΌμ„œ bar의 경우 μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•  μ‹λ³„μžκ°€ μ—†κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ν•  수 μ—†λ‹€. κ·Έλ ‡λ‹€λ©΄ μ›λž˜λŠ” foo도 ν˜ΈμΆœν•  수 μ—†μ–΄μ•Ό ν•œλ‹€. κ·Έ μ΄μœ λŠ” fooλΌλŠ” μ΄λ¦„μœΌλ‘œ μ‹λ³„μžλ₯Ό μ„ μ–Έν•œ 적도 μ—†κ³  ν• λ‹Ήν•œ 적도 μ—†λ‹€. κ·Έλ ‡μ§€λ§Œ js 엔진은 μ•”λ¬΅μ μœΌλ‘œ fooλΌλŠ” μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œλ‹€.

js 엔진은 ν•¨μˆ˜ 선언문을 해석해 ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€. 이 λ•Œ μ‹λ³„μžκ°€ μ—†κΈ° λ•Œλ¬Έμ— μƒμ„±λœ ν•¨μˆ˜ 객체λ₯Ό μ°Έμ‘°ν•  수 μ—†μœΌλ―€λ‘œ ν•¨μˆ˜ 이름과 λ™μΌν•œ μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•˜κ³ , 거기에 ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ήν•œλ‹€.

ν•¨μˆ˜λŠ” ν•¨μˆ˜ 이름을 ν˜ΈμΆœν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ‘œ ν˜ΈμΆœν•œλ‹€.

μœ„μ— var add에도js엔진이 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œ μ‹λ³„μž addκ°€ λ‹΄κΈ°κΈ° λ•Œλ¬Έμ— ν• λ‹Ήν•  수 μžˆλŠ” 것이닀.

πŸ₯₯ ν•¨μˆ˜ ν‘œν˜„μ‹

일급 객체 : κ°’μ˜ μ„±μ§ˆμ„ κ°–λŠ” 객체λ₯Ό λ§ν•œλ‹€.

  • js의 ν•¨μˆ˜κ°€ 일급 객체이닀. 즉, ν•¨μˆ˜λ₯Ό κ°’μ²˜λŸΌ 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹ : ν•¨μˆ˜κ°€ 일급 κ°μ²΄λΌλŠ” 점을 μ΄μš©ν•΄ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” μ •μ˜ 방식을 λ§ν•œλ‹€.

  • ν•¨μˆ˜ ν‘œν˜„μ‹μ€ 읡λͺ… ν•¨μˆ˜λ‘œ μƒμ„±ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.
var add = function foo (x, y) {
	return x + y;
};

// ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ‘œ ν˜ΈμΆœν•œλ‹€.
console.log(add(2, 5)); // 7

// ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλ§Œ μœ νš¨ν•œ μ‹λ³„μžμ΄κΈ° λ•Œλ¬Έμ— μ—λŸ¬λ₯Ό λ°œμƒν•œλ‹€.
console.log(foo(2, 5)); // ReferenceError: foo is not defined

ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이고, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν‘œν˜„μ‹μΈ 문이닀.

→ μ„ μ–Έλ¬Έ μžμ²΄λŠ” 선언이기 λ•Œλ¬Έμ— ν‰κ°€λ˜μ§€ μ•Šμ•„ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이고, 일급 객체이기 λ•Œλ¬Έμ— κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμ–΄ ν•¨μˆ˜ ν‘œν˜„μ‹μ—λŠ” κ°’μœΌλ‘œ μ‚¬μš©ν•΄μ„œ ν‘œν˜„μ‹μΈ 문이 λ˜λŠ” 것 κ°™λ‹€.

πŸ₯₯ ν•¨μˆ˜ 생성 μ‹œμ κ³Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

console.dir(add); // f add(x, y)
console.dir(sub); // undefined

console.log(add(2, 5)); // 7
console.log(add(2, 5)); // TypeError: sub is not a function

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

var sub = function(x, y) {
	return x - y;
}

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” undefined둜 μ΄ˆκΈ°ν™”λ˜κ³ , ν•¨μˆ˜ 선언문을 톡해 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ μ‹λ³„μžλŠ” ν•¨μˆ˜ 객체둜 μ΄ˆκΈ°ν™”λœλ‹€. λ³€μˆ˜ ν• λ‹Ήλ¬Έμ˜ 값은 할당문이 μ‹€ν–‰λ˜λŠ” μ‹œμ , 즉 λŸ°νƒ€μž„μ— ν‰κ°€λœλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ ν‘œν˜„μ‹λ„ ν•΄λ‹Ή μ½”λ“œλ₯Ό 싀행될 λ•Œ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 λœλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것이닀

  • ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 μ„ μ–Έν•œλ‹€λŠ” κ·œμΉ™μ„ λ¬΄μ‹œν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ μ„ μ–Έλ¬Έ λŒ€μ‹  ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•  것을 ꢌμž₯ν•œλ‹€.

πŸ₯₯ Function μƒμ„±μž ν•¨μˆ˜

빌트인 ν•¨μˆ˜μΈ Futioon μƒμ„±μž ν•¨μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 방식은 μΌλ°˜μ μ΄μ§€λ„ μ•Šκ³  λ°”λžŒμ§ν•˜μ§€λ„ μ•Šλ‹€. ν΄λ‘œμ €λ₯Ό μƒμ„±ν•˜μ§€λ„ μ•ŠλŠ” λ“±, ν•¨μˆ˜ μ„ μ–Έλ¬Έμ΄λ‚˜ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μƒμ„±ν•œ ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€.

console.dir(add); // f add(x, y)
console.dir(sub); // undefined

console.log(add(2, 5)); // 7
console.log(add(2, 5)); // TypeError: sub is not a function

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

var sub = function(x, y) {
	return x - y;
}

πŸ₯₯ ν™”μ‚΄ν‘œ ν•¨μˆ˜

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 기쑴의 ν•¨μˆ˜λ³΄λ‹€ ν‘œν˜„μ— λ”λΆˆμ–΄ λ‚΄λΆ€ λ™μž‘ λ˜ν•œ κ°„λž΅ν™”λ˜μ–΄ μžˆλ‹€. κΈ°μ‘΄ ν•¨μˆ˜μ™€ λ‹€λ₯Έ 점듀은 λ‹€μŒκ³Ό κ°™λ‹€.

  • μƒμ„±μž ν•¨μˆ˜λ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.
  • this 바인딩 방식이 λ‹€λ₯΄λ‹€
  • prototype ν”„λ‘œνΌν‹°κ°€ μ—†λ‹€.
  • arguments 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

μ°Έκ³  : λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.