JavaScript

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

Chae-riπŸ’ 2024. 6. 30. 01:25

ν•¨μˆ˜λž€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ 값을 κ³„μ‚°ν•˜λŠ” λ“±μ˜ 과정을 ν‘œν˜„ν•˜κ³  이λ₯Ό ν•˜λ‚˜μ˜ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ μ‹€ν–‰ λ‹¨μœ„λ‘œ λ§Œλ“€μ–΄ 놓은 것을 μ˜λ―Έν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ₯Ό 크게 4가지 λ°©λ²•μœΌλ‘œ μ •μ˜ν•œλ‹€.

 

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

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ κ°€μž₯ 일반적으둜 μ‚¬μš©ν•˜λŠ” 방식

function(a, b) {
	return a + b
}

 

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

λ‹€μŒ 예제처럼 ν•¨μˆ˜λŠ” ν‘œν˜„μ‹μœΌλ‘œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

const sum = function (a, b) {
	return a + b
}

sum(10, 24) // 24

πŸ’‘ 일급 객체 : λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λŠ” 객체

 

ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜κ°’μ΄ 될 수 있고 μœ„ 예제처럼 할당도 κ°€λŠ₯ν•˜λ‹€. -> 일급 객체가 되이 μœ„ν•œ 쑰건을 ν•¨μˆ˜λŠ” λͺ¨λ‘ κ°–μ·„μŒ!

 

ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν‘œν˜„μ‹μ˜ 차이

ν˜Έμ΄μŠ€νŒ…κ³Ό κ΄€λ ¨ν•˜μ—¬ ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 큰 차이가 μžˆλ‹€.

 

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

hello() // hello

function hello() {
	console.log('hello')
}

hello() // hello

hello ν•¨μˆ˜ μ½”λ“œκ°€ 쀑간에 μžˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μ •μƒμ μœΌλ‘œ 좜λ ₯이 λœλ‹€. μ΄λŠ” ν•¨μˆ˜μ— λŒ€ν•œ 선언을 μ‹€ν–‰ 전에 미리 λ©”λͺ¨λ¦¬μ— λ“±λ‘ν•˜λŠ” μž‘μ—…μΈ ν˜Έμ΄μŠ€νŒ… λ•Œλ¬Έμ— μ½”λ“œ μˆœμ„œ 상관없이 정상 좜λ ₯이 λ˜λŠ” 것이닀.

 

반면 ν•¨μˆ˜ ν‘œν˜„μ‹μ„ 보자

 

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

console.log(typeof hello === 'undefine') // true

hello() // Uncaught TypeError: hello is not a function

var hello = function () {
	console.log('hello')
}

hello()

ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό λ‹€λ₯΄κ²Œ hello에 undefinedκ°€ λ‚¨μ•„μžˆλŠ” κ±Έ λ³Ό 수 μžˆλ‹€.

ν•¨μˆ˜ 싀행을 ν•˜κΈ° μ „(λŸ°νƒ€μž„ μ „)에 hello λ³€μˆ˜μ— undefined둜 μ΄ˆκΈ°ν™”κ°€ 된 것이닀.

할당문이 μ‹€ν–‰λ˜λŠ” μ‹œμ μΈ λŸ°νƒ€μž„ μ‹œμ μ— ν•¨μˆ˜κ°€ ν• λ‹Ή λ˜μ–΄ λ‘λ²ˆμ§Έ hello()μ—λŠ” 정상 좜λ ₯이 λœλ‹€.

 

Function μƒμ„±μž

const add = new function('a', 'b', 'return a + b')

add(10, 24) // 34

Function μƒμ„±μžλ₯Ό μ΄μš©ν•˜μ—¬ ν•¨μˆ˜λ₯Ό λ§Œλ“€ μˆ˜λ„ μžˆλŠ”λ° 이 방법은 일반적으둜 잘 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

κ·Έ μ΄μœ λŠ” 예제 μ½”λ“œμ—μ„œ λ³΄μ΄λ‹€μ‹œν”Ό.

λ§€κ°œλ³€μˆ˜μ™€ ν•¨μˆ˜μ˜ λͺΈν†΅μ„ λͺ¨λ‘ λ¬Έμžμ—΄λ‘œ μž‘μ„±ν•΄μ•Ό ν•˜λ©°, 이 방법은 μ½”λ“œμ˜ μ–‘ 길어진닀면 λ³΅μž‘ν•΄μ§ˆ 것이닀.

이 λ°©μ‹μœΌλ‘œ ν–ˆμ„ λ•ŒλŠ” ν•¨μˆ˜μ˜ ν΄λ‘œμ € λ˜ν•œ 생성할 수 μ—†λ‹€.

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

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ES6μ—μ„œ μƒˆλ‘œ λ„μž…λœ ν•¨μˆ˜ 생성 방식이닀.

const add = (a, b) => {
	return a + b
}

const add = (a, b) => a + b

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜μ™€ λͺ‡ 가지 차이점이 μžˆλ‹€.

 

1. constructor μ‚¬μš© λΆˆκ°€

const Car = (name) => {
	this.name = name
}

// Uncaught TypeError: Car is not a constructor
const MyCar = new Car('ν•˜μ΄')

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œλŠ” constructorλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. 즉, μƒμ„±μž ν•¨μˆ˜λ‘œ μ‚¬μš© λΆˆκ°€λŠ₯!!!

 

2. arguments 쑴재 X

function hello() {
	console.log(arguments)
}

// Arguments(3) [1, 2, 3, calle: f, Symbol(Symbol.iterator): f]
hello(1, 2, 3)

const hi = () => {
	console.log(arguments)
}

// Uncaught ReferenceError: arguments is not defined
hi(1, 2, 3)

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œλŠ” argumentsκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

3. this 바인딩이 μ—†μŒβ­οΈβ­οΈβ­οΈ

κ°€μž₯ 큰 차이점은 this λ°”μΈλ”©μ—μ„œ λ³Ό 수 μžˆλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 바인딩 κ΄€λ ¨ν•΄μ„œ 포슀트λ₯Ό λ”°λ‘œ ν•˜λ„λ‘ ν•˜κ² λ‹€..

일단 μ—¬κΈ°μ„œ μ“°μ΄λŠ” κ²ƒλ§Œ κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•˜μžλ©΄

일반 ν•¨μˆ˜ -> 동적 바인딩
ν™”μ‚΄ν‘œ ν•¨μˆ˜ -> 정적 바인딩

 

μœ„μ²˜λŸΌ λΆ„λ₯˜ν•  수 μžˆλŠ”λ°

 

μΌλ°˜ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ ν•¨μˆ˜κ°€ μ–΄λ–»κ²Œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€μ— 따라 this에 바인딩할 객체가 λ™μ μœΌλ‘œ κ²°μ •λœλ‹€.

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ this에 바인딩할 객체가 μ •μ μœΌλ‘œ κ²°μ •λ˜λŠ”λ°

thisλŠ” μ–Έμ œλ‚˜ μƒμœ„ μŠ€μ½”ν”„μ˜ thisλ₯Ό 가리킨닀. 즉, Lexical thisλ₯Ό 가진닀. (Lexical scopeλž‘ λΉ„μŠ·ν•œ κ°œλ…)

 

 

일반 ν•¨μˆ˜(동적 바인딩)

function TraditionalFunctionExample() {
  this.value = 42;

  this.getValue = function() {
    console.log('Traditional Function:', this.value); // 'this'λŠ” ν˜ΈμΆœν•˜λŠ” 객체에 λ°”μΈλ”©λ©λ‹ˆλ‹€.
  }
}

const obj1 = new TraditionalFunctionExample();
obj1.getValue(); // Traditional Function: 42

const obj2 = {
  value: 100,
  getValue: obj1.getValue
};

obj2.getValue(); // Traditional Function: 100 ('this'λŠ” obj2에 λ°”μΈλ”©λ©λ‹ˆλ‹€.)

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜(정적 바인딩)

function ArrowFunctionExample() {
  this.value = 42;

  this.getValue = () => {
    console.log('Arrow Function:', this.value); // 'this'λŠ” ArrowFunctionExample의 μ»¨ν…μŠ€νŠΈμ— λ°”μΈλ”©λ©λ‹ˆλ‹€.
  }
}

const obj3 = new ArrowFunctionExample();
obj3.getValue(); // Arrow Function: 42

const obj4 = {
  value: 100,
  getValue: obj3.getValue
};

obj4.getValue(); // Arrow Function: 42 ('this'λŠ” μ—¬μ „νžˆ ArrowFunctionExample의 μ»¨ν…μŠ€νŠΈλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.)
728x90

'JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[JavaScript] var, let, const 비ꡐ (+ ν˜Έμ΄μŠ€νŒ… μ΄ν•΄ν•˜κΈ°)  (0) 2024.06.28