javascript/DeepDive

[Js λ”₯λ‹€μ΄λΈŒ] 12. ν•¨μˆ˜ (1)

hw.kr 2022. 11. 5. 13:55

πŸ“Œ Js μ—μ„œ ν•¨μˆ˜

μŠ€μ½”ν”„, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ, ν΄λ‘œμ €, μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성, λ©”μ„œλ“œ, this λ°”μΈνŒ…, ν”„λ‘œν† νƒ€μž…, λͺ¨λ“ˆν™”와 κΉŠμ€ 관련이 있기 λ•Œλ¬Έμ— js ν•¨μˆ˜λŠ” 정말 μ€‘μš”ν•œ κ°œλ…μ΄λ‹€!

 

ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유?

 

var x = prompt();
var y = prompt();

if (Number(x) === Number(y)){
    console.log(true)
}else{
    console.log(false)
}

function is_same(a, b){
    return Number(a) === Number(b)
}
console.log(is_same(x, y))

 

ν•¨μˆ˜μ˜ κ°€μž₯ 큰 μž₯점은 μ½”λ“œμ˜ μž¬μ‚¬μš©μ΄λ‹€.

ν•¨μˆ˜ 없이 λ‘κ°œλ₯Ό λΉ„κ΅ν•΄λ³΄λŠ” 경우λ₯Ό 생각해보면 if / else λ₯Ό 반볡적으둜 μ¨μ•Όν•˜μ§€λ§Œ 

ν•¨μˆ˜λ₯Ό ν•œλ²ˆ μƒμ„±ν•˜κΈ°λ§Œ ν•œλ‹€λ©΄ 비ꡐλ₯Ό ν•΄μ•Όν•˜λŠ” μƒν™©μ—μ„œ λ§Œλ“€μ–΄λ‘” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  λ§€κ°œλ³€μˆ˜ x, y λ₯Ό λ„˜κ²¨μ£ΌκΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

 

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

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 객체 νƒ€μž…μ˜ 값이닀.
ν‘œν˜„μ‹μ„ ν†΅ν•΄μ„œ 평가 되고, κ·Έ ν‰κ°€μ˜ 결과둜 객체 νƒ€μž…μ˜ 값이 ν• λ‹Ήλœλ‹€.
λ”°λΌμ„œ ν•¨μˆ˜λ„ λ³€μˆ˜μ— λ¦¬ν„°λŸ΄λ‘œ 값을 ν• λ‹Ήν•˜λŠ” 것 처럼, ν•¨μˆ˜ λ¦¬λŸ¬ν„Έλ‘œ 생성할 수 μžˆλ‹€.
일반 κ°μ²΄λŠ” 생성 ν›„ ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€.

 

πŸ“Œ λ³€μˆ˜μ— ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν• λ‹Ή

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

var new_function = my_function();
console.log(new_function(2, 4)); // 6

 

2. ν•¨μˆ˜ μ •μ˜

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄μ„œ 평가가 되고 ν•¨μˆ˜ 객체 값이 λœλ‹€.
ν•¨μˆ˜ 선언문이 평가 되면 μ‹λ³„μžκ°€ μƒμ„±λ˜κ³  ν•¨μˆ˜ 객체가 ν• λ‹Ήλœλ‹€
λ³€μˆ˜λŠ” μ„ μ–Έλ˜κ³ , ν•¨μˆ˜λŠ” μ •μ˜ λœλ‹€.

 

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

 

// ν•¨μˆ˜ 선언문은 이름을 μƒλž΅ν•  수 μ—†λ‹€.
function (x, y){
	return x + y;
}

function add(x, y){
	return x + y;
}
// ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ 이름을 μƒλž΅ν•  수 μžˆλ‹€.
var my_function = function(x ,y){
	ruturn x + y;
}

 

ν•¨μˆ˜ 선언문은 λ³€μˆ˜ μ„ μ–Έλ¬Έκ³Ό λ™μΌν•˜κ²Œ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이닀.

즉, ν•¨μˆ˜ μ„ μ–Έλ¬Έ ν•˜λ‚˜λ‘œλŠ” 값을 평가할 수 μ—†λ‹€λŠ” 것이닀

 

 

ν‘œν˜„μ‹μΈ λ¬Έκ³Ό ν‘œν˜„μ‹μ΄ μ•„λ‹Œλ¬Έμ„ κ΅¬λ³„ν•˜κΈ° κ°€μž₯ μ‰¬μš΄ 방법은,

λ³€μˆ˜μ— ν• λ‹Ήν•΄λ³΄λŠ” 것이닀.

μ•„λž˜μ˜ μ˜ˆμ‹œ λ‘˜λ‹€ ν‘œν˜„μ‹μ˜ μ•„λ‹Œ 문이고, κ°’μœΌλ‘œ ν‰κ°€λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.

 

// λ³€μˆ˜μ— ν‘œν˜„μ‹μ„ 톡해 ν‰κ°€λ˜μ§€ μ•Šμ€ κ°’ ν• λ‹Ή, 잘λͺ»λœ 방법
var num = var x; 
// λ³€μˆ˜μ— ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문인 ν•¨μˆ˜ 선언문을 ν• λ‹Ή
var new_function = function add(x, y){
    return x + y;
}
console.log(new_function(2, 4)); // 6

λ³€μˆ˜μ— ν‘œν˜„μ‹μ΄ μ•„λ‹Œ λ¬Έ 즉, κ°’μœΌλ‘œ 평가될 수 μ—†λŠ” 문을 ν• λ‹Ήν–ˆλŠ”λ° μ •μƒμ μœΌλ‘œ λ™μž‘ν•œλ‹€.

 

🧐 μ™œ μ •μƒμ μœΌλ‘œ λ™μž‘ν• κΉŒ?

{} 와 이름이 μžˆλŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ μ€‘μ˜μ  ν‘œν˜„μ΄κΈ° λ•Œλ¬Έμ΄λ‹€

 

// 이름이 μžˆλŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄
function add(x, y){
	return x + y;
}

 

μ½”λ“œμ˜ λ¬Έλ§₯에 λ”°λΌμ„œ 이름이 μžˆλŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ˜λŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ 해석될 수 있기 λ•Œλ¬Έμ΄λ‹€.

{} 와 이름 μžˆλŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ λ‹¨λ…μœΌλ‘œ μ“°μ΄λŠ” λ¬Έλ§₯μ—μ„œλŠ”, ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ ν•΄μ„λœλ‹€.

{} 와 이름 μžˆλŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄ κ°’μœΌλ‘œ ν‰κ°€λ˜μ–΄μ•Ό ν•˜λŠ” λ¬Έλ§₯(ν• λ‹Ή μ—°μ‚°μžμ˜ μš°λ³€μΈ ν”Όμ—°μ‚°μž) μ—μ„œλŠ”, ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•΄μ„λœλ‹€.

 

// κ°’μœΌλ‘œ ν‰κ°€λ˜μ–΄μ•Ό ν•˜λŠ” λ¬Έλ§₯μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄μ„œ μš°λ³€μ— μžˆλŠ” ν•¨μˆ˜ 선언문이 ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•΄μ„λœλ‹€.
var new_function = function add(x, y){
    return x + y;
}

// μ΄λ ‡κ²Œ μž‘μ„±ν•œκ²ƒκ³Ό λ™μΌν•˜κ²Œ ν•΄μ„λœλ‹€.
var new_function = function (x, y){
    return x + y;
}

μ΄λŸ¬ν•œ 이유둜 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문을 할당해도 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ” 것이닀.

 

πŸ“Œ μ„ μ–Έλ¬Έκ³Ό λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μ˜ μ€‘μš”ν•œ 차이

 

function say_hello(){
	console.log("hello!");
}

say_hello(); // hello!

(function say_hello(){ console.log("hello!"); })

say_hello(); // ReferenceError : say_hello is not defined

 

κ·Έλ£Ή μ—°μ‚°μž () 내에 μžˆμœΌλ―€λ‘œ ν•¨μˆ˜ 선언문은 ν”Όμ—°μ‚°μžλ‘œ ν•΄μ„λ˜μ–΄ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•΄μ„λœλ‹€. 

ν”Όμ—°μ‚°μžλŠ” κ°’μœΌλ‘œ 평가될 수 μžˆμ–΄μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ μœ„μ—μ„œ μ‚΄νŽ΄ 봀듯이 ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ λ¬Έμ΄λΌμ„œ κ°’μœΌλ‘œ ν‰κ°€λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— undefined λ₯Ό ν˜ΈμΆœν•˜λŠ” 것과 λ§ˆμ°¬κ°€μ§€μ΄λ‹€

 

πŸ“Œ ν•¨μˆ˜ μ΄λ¦„μ˜ μ—­ν• 

 

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

console.log(add(2, 4)); // ReferenceError : add is not defined

 

"ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžμ΄λ‹€."

λ”°λΌμ„œ ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” ν˜ΈμΆœν•  수 μ—†λ‹€.

λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ μ‚¬μš©λœ add ν•¨μˆ˜λ₯Ό κ°€λ₯΄ν‚€λŠ” μ‹λ³„μžκ°€ μ—†λ‹€λŠ” λœ»μ΄λ‹€.

 

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

console.log(add(2, 4)); // 6

ν•˜μ§€λ§Œ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ ν•¨μˆ˜ add λŠ” μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λŸ°νƒ€μž„ μ‹œμ  이전에 평가λ₯Ό ν• λ•Œ ν•¨μˆ˜ 선언문을 ν•΄μ„ν•˜κ³  ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜κ³ , κ·Έ 객체의 μ‹œμž‘ μ£Όμ†Œλ₯Ό κ°€λ₯΄ν‚€λŠ” μ‹λ³„μž add λ₯Ό  μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•¨μˆ˜ 객체λ₯Ό κ°€λ₯΄ν‚€λŠ” μ‹λ³„μžλ₯Ό ν†΅ν•΄μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것이닀 !

 

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

 

μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” κ°μ²΄μ΄μ§€λ§Œ κ°’μ˜ μ„±μ§ˆμ„ κ°–κΈ°λ•Œλ¬Έμ— μ—¬κΈ°μ €κΈ°μ„œ 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹€.

λ”°λΌμ„œ 일급 객체라고 λΆˆλ¦°λ‹€.

 

ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 방식을 ν•¨μˆ˜ ν‘œν˜„μ‹ 이라고 ν•œλ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ 읡λͺ… ν•¨μˆ˜(이름이 μ—†λŠ” ν•¨μˆ˜)λ₯Ό μ‚¬μš©ν•œλ‹€.

 

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

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

// ν•¨μˆ˜λ₯Ό 호좜 ν•  λ•ŒλŠ”, ν•¨μˆ˜ 이름이 μ•„λ‹Œ ν•¨μˆ˜ 객체λ₯Ό κ°€λ₯΄ν‚€λŠ” μ‹λ³„μžλ₯Ό μ‚¬μš©ν•œλ‹€
var sub = function minus(x, y){
	return x - y;
}

console.log(minus(6, 2)); // ReferenceError
console.log(sub(6, 2)); // 4

 

πŸ“Œ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

 

console.log(add(2, 4)); // 6
console.log(sub(6, 4)); // TypeError : sub is not function

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

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

 

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

 

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄, μ½”λ“œκ°€ ν•œμ€„μ”© μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„ μ‹œμ  이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄μ„œ ν•¨μˆ˜ 객체가 μƒμ„±λ˜κ³  κ·Έ 객체λ₯Ό κ°€λ₯΄ν‚€λŠ” μ‹λ³„μžλ„ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœλ‹€.

λŸ°νƒ€μž„ μ‹œμ μ—λŠ” 이미 ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜κ°€ μƒμ„±λ˜μ–΄ 있고, κ·Έ ν•¨μˆ˜ 객체λ₯Ό κ°€λ₯΄ν‚€λŠ” μ‹λ³„μžλ„ 생성 λ˜μžˆλŠ” 것이닀.

이λ₯Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λΌκ³  ν•œλ‹€.

 

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

 

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 값이 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ΄λ‹€

λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  λ³€μˆ˜μ— μ›μ‹œ 값을 ν• λ‹Ήν•˜λŠ” 것과 λ™μΌν•˜κ²Œ λ™μž‘ν•œλ‹€. 

// ν•¨μˆ˜ ν‘œν˜„μ‹μ€ 이와 λ™μΌν•˜κ²Œ λ™μž‘
var x; // λ³€μˆ˜ μ„ μ–Έλ¬Έ
x = 10; // λ³€μˆ˜ κ°’ ν• λ‹Ήλ¬Έ
var x = 10; // μΆ•μ•½

var sub; // λ³€μˆ˜ μ„ μ–Έλ¬Έ
sub = function(x, y){ // ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹
	return x - y;
}

 

λ³€μˆ˜ κ°’ 할당문은 λŸ°νƒ€μž„ 이전이 μ•„λ‹Œ, λŸ°νƒ€μž„ μ‹œμ μ— κ°’μœΌλ‘œ 평가 λ˜λ―€λ‘œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ„ λ§ˆμ°¬κ°€μ§€λ‘œ λŸ°νƒ€μž„ μ‹œμ μ— ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 λœλ‹€. 

ν•¨μˆ˜ ν‘œν˜„μ‹ 이전에 ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ €κ³  ν•˜λ©΄ undefined λ₯Ό ν˜ΈμΆœν•˜λŠ” 것과 λ§ˆμ°¬κ°€μ§€ μ΄λ―€λ‘œ, TypeError 이 λ°œμƒν•œλ‹€.

 

πŸ“Œ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… vs ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

 

ν˜Έμ΄μŠ€νŒ… λ³€μˆ˜ ν•¨μˆ˜
곡톡점 λŸ°νƒ€μž„ 이전에 μ‹λ³„μžλ₯Ό μƒμ„±ν•œλ‹€
차이점 undefined 둜 평가 ν•¨μˆ˜ 객체둜 평가, μ„ μ–Έλ¬Έ 이전에 호좜 κ°€λŠ₯

 

 

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

 

var add = new Function('x', 'y', 'return x + y');
console.log(add(2, 4));

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

 

4️⃣ ν™”μ‚΄ν‘œ ν•¨μˆ˜

 

const add = (x, y) => x + y;
console.log(add(2, 4)); // 6

 

Es6 λΆ€ν„°λŠ” ν•¨μˆ˜ μ •μ˜ν•˜λŠ”λ° ν•„μš”ν•œ ν‘œν˜„μ„ κ°„λž΅νžˆ ν•˜κΈ° μœ„ν•΄μ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

ν‘œν˜„ 뿐만 μ•„λ‹ˆλΌ, ν•¨μˆ˜μ˜ λ‚΄λΆ€λ™μž‘ λ˜ν•œ κ°„λž΅ν™” λ˜μ–΄μžˆλ‹€.