🐸 [JavaScript] ν•¨μˆ˜

hnyoojinΒ·2024λ…„ 9μ›” 1일

🐸 JS λ§ˆμŠ€ν„° 되기

λͺ©λ‘ 보기
11/19
post-thumbnail

ν•¨μˆ˜λŠ” JavaScript의 핡심 κ°œλ…μ΄λ‹€.

사싀 ν•¨μˆ˜κ°€ μ€‘μš”ν•œ 것을 λͺ¨λ₯΄λŠ” μ‚¬λžŒμ€ 없을 것 κ°™λ‹€.

codeλ₯Ό μž¬μ‚¬μš©ν•΄μ„œ μ‹€ν–‰ νš¨μœ¨μ„ 높이고, μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§€κ³ , νŽΈμ˜μ„±κ³Ό 신뒰성이 λ†’μ•„μ§„λ‹€.

본격적으둜 ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.


ν•¨μˆ˜

μ—¬λŠ μ–Έμ–΄μ—μ„œλ‚˜ ν•¨μˆ˜λŠ”, μž…λ ₯값을 λ°›μ•„ 좜λ ₯값을 λ°˜ν™˜ν•˜λŠ” λ§€μ»€λ‹ˆμ¦˜μ„ λ”°λ₯Έλ‹€.

JavaScriptμ—μ„œλ„ μ˜ˆμ™ΈλŠ” μ—†λŠ”λ°,
μž…λ ₯값인 argumentλ₯Ό λ³€μˆ˜ parameter둜 λ°›μ•„μ„œ, 좜λ ₯값인 return valueλ₯Ό λ°˜ν™˜ν•œλ‹€.

// (x, y) : parameter
function add (x, y) {			// μ •μ˜
  	return x + y; // x + y : return value
}
...
add (1, 3);	// 1, 3 : argument	// 호좜

κ°„λ‹¨ν•œ ν•¨μˆ˜μ˜ ν˜•νƒœλŠ” μ•Œμ•˜μœΌλ‹ˆ,

ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜κ³  μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄ 더 μ•Œμ•„λ³΄μž.



ν•¨μˆ˜ 생성

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

JavaScript의 ν•¨μˆ˜λŠ”, 객체닀.

ν•˜μ§€λ§Œ 이λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€λŠ” μ μ—μ„œ 일반 κ°μ²΄μ™€μ˜ 차이가 μžˆλ‹€.

λ‹€μŒμ€ ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ˜ κ΅¬μ„±μš”μ†Œλ“€μ„ μ •λ¦¬ν•œ ν‘œλ‹€.

κ΅¬μ„±μš”μ†Œμ„€λͺ…
ν•¨μˆ˜ 이름1. ν•¨μˆ˜ 이름: μ‹λ³„μž (넀이밍 κ·œμΉ™ μ€€μˆ˜ν•΄μ•Όν•¨)
2. ν•¨μˆ˜ 이름 : body λ‚΄μ—μ„œλ§Œ μ°Έμ‘° κ°€λŠ₯
3. ν•¨μˆ˜ 이름 : μƒλž΅ κ°€λŠ₯ : 무λͺ…/읡λͺ… ν•¨μˆ˜λΌκ³  함
λ§€κ°œλ³€μˆ˜ λͺ©λ‘0개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜, ()둜 감싸고 ,둜 ꡬ뢄
ν•¨μˆ˜ ν˜ΈμΆœμ‹œ μˆœμ„œλŒ€λ‘œ 인수 ν• λ‹Ή.
λ§€κ°œλ³€μˆ˜ : body λ‚΄μ—μ„œ λ³€μˆ˜μ™€ λ™μΌν•œ μ·¨κΈ‰ (넀이밍 κ·œμΉ™ μ€€μˆ˜)
bodyν•¨μˆ˜ ν˜ΈμΆœμ‹œ 싀행문듀을 μ •μ˜ν•΄λ‘” ν•˜λ‚˜μ˜ code block
ν•¨μˆ˜ ν˜ΈμΆœμ— μ˜ν•΄ 싀행됨

ν•¨μˆ˜ μ •μ˜

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  μ‚¬μš©ν•˜κΈ°μ— μ•žμ„œ, μš°μ„  ν•¨μˆ˜ μ •μ˜λ₯Ό ν•΄μ•Όν•œλ‹€.

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 방법은 λ„€κ°€μ§€κ°€ μžˆλ‹€.

1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ

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

μš°λ¦¬κ°€ ν•¨μˆ˜μ˜ κ°œλ…μ—μ„œ μ‚΄νŽ΄λ³Έ λ°”λ‘œ κ·Έ 방식이닀.

μ΄λŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄κ³Ό λ™μΌν•œ ν˜•νƒœμ΄μ§€λ§Œ, ν•¨μˆ˜ μ„ μ–Έλ¬Έμ—μ„œλŠ” ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€.


ν•¨μˆ˜ 선언문은, ν‘œν˜„μ‹μ΄ μ•„λ‹Œ "λ¬Έ"μ΄λΌλŠ” κ±Έ κΈ°μ–΅ν•˜μž.
(consoleμ—μ„œ 이λ₯Ό μ‹€ν–„ν•˜λ©΄ μ™„λ£Œκ°’ undefinedκ°€ 좜λ ₯λœλ‹€.)

λ•Œλ¬Έμ— ν•¨μˆ˜ 선언문은 λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.


JavaScriptλŠ” μƒμ„±λœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄, ν•¨μˆ˜ 이름과 λ™μΌν•œ μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œλ‹€.

그리고 ν•΄λ‹Ή μ‹λ³„μžμ— ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ήν•˜κ³ ,
ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” ν•¨μˆ˜ 이름이 μ•„λ‹Œ, ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ‘œ ν˜ΈμΆœν•œλ‹€.

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

JavaScript 엔진은, ν•¨μˆ˜ 선언문을 이와같이 λ³€ν™˜ν•΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€λŠ” 것이닀.

그런데 λ°”λ‘œ μ•„λž˜μ˜ ν•¨μˆ˜ ν‘œν˜„μ‹μ„ 보면,,,,, λ˜‘κ°™μ΄ 생겼닀.

κ·ΈλŸ¬λ‹ˆκΉŒ JavaScript 엔진은, ν•¨μˆ˜ 선언문을 ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ λ³€ν™˜ν•΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€.
(μ„ μ–Έλ¬Έκ³Ό ν‘œν˜„μ‹μ΄ μ •ν™•νžˆ λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.)


2. ν•¨μˆ˜ ν‘œν˜„μ‹

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

JavaScript의 ν•¨μˆ˜λŠ” 값이 될 μˆ˜λ„ 있고, λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 μˆ˜λ„ μžˆλ‹€.

μ΄λ ‡κ²Œ κ°’μ˜ μ„±μ§ˆμ„ κ°–λŠ” 객체λ₯Ό 일급 객체 라고 λΆ€λ₯Έλ‹€.
(JavaScript ν•¨μˆ˜λŠ” 일급 객체닀.)

-> ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 있고, 이런 μ •μ˜ 방식을 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λΌκ³  ν•œλ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ—μ„œλŠ”, ν•¨μˆ˜ 이름을 λŒ€λΆ€λΆ„ μƒλž΅ν•œλ‹€.

ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ— 차이가 μ—†λŠ” λ“― ν•˜μ§€λ§Œ,,,

선언문은 'ν‘œν˜„μ‹μ΄ μ•„λ‹Œ λ¬Έ'이고 ν‘œν˜„μ‹μ€ 'ν‘œν˜„μ‹μΈ λ¬Έ'μ΄λΌλŠ” μ μ—μ„œ 차이가 μžˆμŒμ„ κΈ°μ–΅ν•˜μž.


3. Function μƒμ„±μž ν•¨μˆ˜

let add = new Function ('x', 'y', 'return x + y');

사싀 이 방식은, μΌλ°˜μ μ΄μ§€λ„ λ°”λžŒμ§ν•˜μ§€λ„ μ•Šμ€ 방식이라고 ν•œλ‹€.

μ„ μ–Έλ¬Έ, ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ™€λŠ” 차이점이 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ 아직 μ‚΄νŽ΄λ³΄μ§€ μ•ŠλŠ” λΆ€λΆ„μ—μ„œ 차이점이 μžˆμœΌλ‹ˆ, μ§€κΈˆμ€ κ·Έλƒ₯ 차이점이 μžˆλ‹€λŠ” μ •λ„λ§Œ μ•Œμ•„λ‘μž.

4. ν™”μ‚΄ν‘œ ν•¨μˆ˜ (ES6)

let add = (x, y) => x + y;

function ν‚€μ›Œλ“œ λŒ€μ‹  => λ₯Ό μ‚¬μš©ν•œλ‹€.

μ’€ 더 κ°„λž΅ν•œ 방법이닀.

생긴 κ²ƒλ§Œ κ°„λž΅ν•œ 게 μ•„λ‹ˆκ³ , λ™μž‘λ„ κ°„λž΅ν™” λ˜μ–΄μžˆλ‹€κ³  ν•œλ‹€!



ν•¨μˆ˜ μƒμ„±μ‹œμ  & ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ”, μ„ μ–Έλ¬Έ 이전에 호좜이 κ°€λŠ₯ν•˜λ‹€.

ν•˜μ§€λ§Œ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ”, ν‘œν˜„μ‹ 이전에 호좜이 λΆˆκ°€λŠ₯ν•˜λ‹€.

이런 차이가 μƒκΈ°λŠ” μ΄μœ κ°€ 뭘까?


두 ν•¨μˆ˜μ˜ 생성 μ‹œμ μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.


μ•žμ„œ λ³€μˆ˜μ— λŒ€ν•΄ μ‚΄νŽ΄λ³Ό λ•Œ, JavaScript의 λͺ¨λ“  선언은 runtime 이전에 λ¨Όμ € μ‹€ν–‰λœλ‹€κ³  ν–ˆλ‹€.

ν•¨μˆ˜ 선언문도 μ˜ˆμ™ΈλŠ” μ—†λ‹€. ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ”, κ·Έ 객체가 runtime 이전에 λ¨Όμ € μƒμ„±λœλ‹€.

κ·ΈλŸ¬λ‹ˆκΉŒ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•˜λ©΄, ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λΌλŠ” νŠΉμ„±μ„ κ°€μ§„λ‹€.


ν•˜μ§€λ§Œ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄, ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ μ•„λ‹Œ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•œλ‹€.

λ•Œλ¬Έμ— ν‘œν˜„μ‹ 이전에 ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ undefined둜 ν‰κ°€λœλ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€λ©΄, λ°˜λ“œμ‹œ ν‘œν˜„μ‹ 이후에 ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ„λ‘ ν•˜μž.

(JavaScript의 ν•¨μˆ˜ 선언문이 κ°€μ§€λŠ” ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ„ ν”Όν•˜κΈ° μœ„ν•΄,
ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•˜λŠ” 것이 ꢌμž₯λœλ‹€κ³  ν•œλ‹€.)


ν•¨μˆ˜ 호좜

add = (x, y);

ν•¨μˆ˜ ν˜ΈμΆœμ—μ„œλŠ” 직전에 μ‚΄νŽ΄λ³Έ ν•¨μˆ˜ μƒμ„±μ‹œμ κ³Ό ν˜Έμ΄μŠ€νŒ…μ΄λΌλŠ” νŠΉμ„±μ„ 잘 κ³ λ €ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λŠ” μ–΄λŠμ •λ„κ°€ μ’‹μ„κΉŒ?

ν•¨μˆ˜λŠ” ν•œ κ°€μ§€ 일을 ν•˜λ„λ‘, κ°€λŠ₯ν•œ κ°€μž₯ μž‘κ²Œ λ§Œλ“œλŠ” 것이 이상적이닀.

이상적인 λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λŠ” 0κ°œμ΄λ‚˜, κ°œλ°œμžλ“€μ€ 주둜 2개, 많으면 3κ°œκΉŒμ§€μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€κ³  ν•œλ‹€.


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

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

Imediately Invoked function expression

(function () {
	let a = 3;
	let b = 5;
  	return a + b;
}());

주둜 읡λͺ… ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

λ¬Όλ‘  이름을 뢙일 μˆ˜λ„ μžˆμ§€λ§Œ,, μ¦‰μ‹œ μ‹€ν–‰ν•˜λŠ” 것이 λͺ©μ μΈ ν•¨μˆ˜μ΄κΈ° λ•Œλ¬ΈμΈλ“―ν•˜λ‹€.

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 항상 κ·Έλ£Ήμ—°μ‚°μžμΈ ()둜 감싸주도둝 ν•˜μž.
(κ·ΈλŸ¬μ§€ μ•ŠμœΌλ©΄ errorκ°€ λ°œμƒν•œλ‹€..)

μž¬κ·€ ν•¨μˆ˜

recursive function

function countdown(n) {
  	if (n < 0) return;
    console.log(n);
  	countdown(n-1);	// μž¬κ·€ 호좜
}
countdown(n);

자기 μžμ‹ μ„ λ¬΄ν•œ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

λ•Œλ¬Έμ— 쑰건을 λ§Œμ‘±ν•˜λ©΄ νƒˆμΆœν•  수 μžˆλ„λ‘, νƒˆμΆœ 쑰건을 λ§Œλ“€μ–΄μ€˜μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ λ¬΄ν•œ ν˜ΈμΆœμ— 빠질 μœ„ν—˜μ„± λ•Œλ¬Έμ—,,, κΌ­ ν•„μš”ν• λ•Œλ§Œ μ‚¬μš©ν•˜λ„λ‘ ν•˜μž.

쀑첩 ν•¨μˆ˜

nested/inner function

function outer() {
	let x = 1;
  
  function inner() {
    let y = 3;
    console.log(x + y);
  }
  inner();
}

ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.

사싀 μ΄λ ‡κ²Œ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ 쀑첩 ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” 것은, ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… 문제둜 λ°”λžŒμ§ν•˜μ§€ μ•Šλ‹€κ³  ν•œλ‹€.

λ‚˜μ€‘μ— μ‚΄νŽ΄λ³Ό μŠ€μ½”ν”„μ™€ ν΄λ‘œμ €μ— κΉŠμ€ 관련이 μžˆλ‹€κ³  ν•œλ‹€.

콜백 ν•¨μˆ˜

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό μ½œλ°±ν•¨μˆ˜λΌκ³  λΆ€λ₯Έλ‹€.

repeat (5, function(i) {
  	if (i % 2) 
      console.log(i);
});

순수/λΉ„μˆœμˆ˜ ν•¨μˆ˜

μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜, λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό pure function이라고 ν•˜κ³ ,
κ·Έ λ°˜λŒ€λ₯Ό impure function이라고 ν•œλ‹€.

pure func의 경우, 동일 μž…λ ₯값이 λ“€μ–΄μ˜€λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값을 λ°˜ν™˜ν•œλ‹€.

impure func의 κ²½μš°λŠ” κ·Έλ ‡μ§€ μ•Šλ‹€.

이λ₯Ό λΆ€μˆ˜νš¨κ³Όκ°€ λ§Žμ€ ν•¨μˆ˜λΌκ³  ν•˜λŠ”λ°, ν•¨μˆ˜μ˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것을 λ§ν•œλ‹€.

즉, impure funcλŠ” μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.



λ‹€λ₯Έ κ°œλ…λ³΄λ‹€ μ•Œμ•„μ•Ό ν•  것도 많고,, μ–΄λ ΅μ§„ μ•Šμ•˜μ§€λ§Œ λ‚΄μš©μ΄ λ§Žμ•„μ„œ μ••λ„μ μ΄μ—ˆλ‹€.

μ€‘μš”ν•œ JavaScript κ°œλ…μ„ ν•˜λ‚˜μ”© μ•Œμ•„κ°€λŠ” 것 κ°™λ‹€.

μ•žμœΌλ‘œλ„ λŒ€μΆ©λŒ€μΆ© κ³΅λΆ€ν•˜μ§€ μ•Šκ³  κΌΌκΌΌν•˜κ²Œ μ•Œμ•„λ΄μ•Όκ² λ‹€.

0개의 λŒ“κΈ€