JavaScript Programming

JavaScript 일반 ν•¨μˆ˜μ™€ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ 차이와 문법

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2024. 12. 20.

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 방법은 크게 두가지이닀. 일반 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법과 ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법이닀.

 

일반 ν•¨μˆ˜

function ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 일반 ν•¨μˆ˜λŠ” ν•¨μˆ˜ 선언식과 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄ μžˆλ‹€.

 

ν•¨μˆ˜μ„ μ–Έμ‹

ν•¨μˆ˜ 선언식은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” κ°€μž₯ 기본적인 방법이닀.

function main() {
	console.log("Hello")
}

main() //ν•¨μˆ˜ 호좜

 

function ν‚€μ›Œλ“œ 뒀에 ν•„μˆ˜μ μœΌλ‘œ ν•¨μˆ˜ 이름을 적고 λΈ”λŸ­ μ•ˆμ— ν•¨μˆ˜ λ‚΄μš©μ„ 적으면 λœλ‹€. ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„  이름을 적으면 λœλ‹€.

ν•¨μˆ˜ μ„ μ–Έμ‹μœΌλ‘œ μž‘μ„±λœ μž‘μ„±λœ ν•¨μˆ˜μ˜ νŠΉμ§•μ€ ν˜Έμ΄μŠ€νŒ…μ΄ λœλ‹€λŠ” 것이닀. ν˜Έμ΄μŠ€νŒ…μ΄ 되기 λ•Œλ¬Έμ— ν•¨μˆ˜ 선언보닀 호좜이 λ¨Όμ € λ˜μ–΄λ„ μ—λŸ¬κ°€ 생기지 μ•Šκ³ , κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€. ν˜Έμ΄μŠ€νŒ…μ΄ 됐기 λ•Œλ¬Έμ— ν•¨μˆ˜λ₯Ό μ΅œμƒλ‹¨μœΌλ‘œ 올리기 λ•Œλ¬Έμ΄λ‹€.

foo()

function foo() {
  console.log('foo');
}

// μ΄λ ‡κ²Œ 해도 foo κ°€ μž˜λ‚˜μ˜¨λ‹€.

 

이름을 가지 μ•ŠλŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„  ν•¨μˆ˜ 선언식이 μ•„λ‹ˆλΌ ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

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

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν•¨μˆ˜ 선언식과 맀우 μœ μ‚¬ν•˜μ§€λ§Œ, 이름이 μ—†λŠ” ν•¨μˆ˜μΈ 읡λͺ… ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. λ˜‘κ°™μ΄ function ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ§€λ§Œ μ•„λž˜μ™€ 같이 이름이 μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

읡λͺ… ν•¨μˆ˜λ₯Ό main μ΄λž€ λ³€μˆ˜μ— ν• λ‹Ήν•΄μ£Όμ—ˆκΈ° λ•Œλ¬Έμ— λ³€μˆ˜ 이름을 ν•¨μˆ˜ μ΄λ¦„μ²˜λŸΌ μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ 호좜이 κ°€λŠ₯ν•˜λ‹€.

const main = function() {
	console.log("hello")
}

main() //hello

 

ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ νŠΉμ§•μ€ ν•¨μˆ˜ 선언식과 λ‹€λ₯΄κ²Œ ν˜Έμ΄μŠ€νŒ…μ΄ λ˜μ§€ μ•ŠλŠ”λ‹€.

main() //Uncaught ReferenceError λ°œμƒ

const main = function() {
	console.log("hello")
}

 

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

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ES6 λ²„μ „μ—μ„œ λ“±μž₯ν•œ 문법이닀. 기쑴의 ν•¨μˆ˜ ν‘œν˜„μ‹μ„ 훨씬 더 κ°„λ‹¨ν•œ λ¬Έλ²•μœΌλ‘œ μž‘μ„±ν•  수 있게 ν•΄μ€€λ‹€.

const main = () => {
	console.log("hello")
}

main()

 

1. return μƒλž΅

const add = (a + b) => {
	return a + b // μ½”λ“œκ°€ 단 ν•œ μ€„μ‘΄μž¬.
}

add()

// μ½”λ“œκ°€ ν•œμ€„λ§Œ μ‘΄μž¬ν•  μ‹œ μ•„λž˜μ™€ 같이 λ³€κ²½ κ°€λŠ₯ν•˜λ‹€.

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

add()

 

2. λ§€κ°œλ³€μˆ˜ μ†Œκ΄„ν˜Έ μƒλž΅

function print(text) {
	console.log(text);
}

print("hi")

// 맀개 λ³€μˆ˜κ°€ ν•˜λ‚˜μΌ 경우 λ§€κ°œλ³€μˆ˜λ₯Ό κ°μ‹ΈλŠ” μ†Œκ΄„ν˜Έλ„ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

const print = (text) => console.log(text)

print("hi")

//μ†Œκ΄„ν˜Έ μƒλž΅

const print = text => console.log(text)

print("hi")

 

λ§€κ°œλ³€μˆ˜κ°€ 볡수개 μ΄κ±°λ‚˜, ν•˜λ‚˜λ„ 없을 μ‹œμ—” λ§€κ°œλ³€μˆ˜μ˜ μ†Œκ΄„ν˜Έκ°€ ν•„μš”ν•˜λ‹€.

 

3. κ°μ²΄λŠ” μ†Œκ΄„ν˜Έλ‘œ ν•œ 번 감싸쀀닀.

const getObject = () => {
	return {name: "hello"}
}

getObject()


// 객체의 μ€‘κ΄„ν˜Έμ™€ ν•¨μˆ˜μ˜ μ€‘κ΄„ν˜Έκ°€ ν—·κ°ˆλ¦΄ 수 μžˆμœΌλ―€λ‘œ κ°μ²΄λŠ” μ†Œκ΄„ν˜Έλ‘œ ν•œλ²ˆ 감싸쀀닀.
const getObject = () => ({name: "hello"})

console.log(getObject()) // hello

 

4. ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ κ°€λ³€μΈμž

function ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ μΌλ°˜ν•¨μˆ˜μ—μ„  λ§€κ°œλ³€μˆ˜λ‘œ λ”°λ‘œ λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ arguments λ³€μˆ˜λ₯Ό  μ•”λ¬΅μ μœΌλ‘œ 전달 λ°›λŠ”λ‹€.

arguments  λ³€μˆ˜λŠ” ν•¨μˆ˜κ°€ μ „달받은 μΈμžλ₯Ό λ‹΄κ³  μžˆλŠ” λ°°μ—΄ν˜•νƒœμ˜ κ°μ²΄μ΄λ‹€.

arguments  λ³€μˆ˜λŠ” 인자의 κ°―μˆ˜κ°€ 정해지지 μ•Šμ€ κ°€λ³€μΈμžκ°€ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό μ“Έ λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ arguments λ₯Ό 전달 받지 μ•ŠλŠ”λ‹€.

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ κ°€λ³€μΈμžλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„  λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜ ꡬ문을 ν™œμš©ν•˜λ©΄ λœλ‹€.

function main() {
	arguments // ν•¨μˆ˜κ°€ 전달받은 인자λ₯Ό λ‹΄κ³  μžˆλŠ” λ°°μ—΄ν˜•νƒœμ˜ 객체이닀.
    console.log(arguments[1]) //2
}

main(1, 2, 3)

//ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” argumentsλ₯Ό 받지 μ•ŠλŠ”λ‹€.

const main = () => {
	console.log(arguments) // Uncaught ReferenceError κ°€ λ°œμƒν•œλ‹€.
}
main(1, 2, 3)

//ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ κ°€λ³€μΈμžλ₯Ό μ²˜λ¦¬ν•˜κ³  μ‹ΆμœΌλ©΄ λ§€κ°œλ³€μˆ˜μ— λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜κ΅¬λ¬Έμ„ ν™œμš©ν•œλ‹€. 

const main = (...args) => {
	console.log(args) //[1, 2, 3]
}
main(1, 2, 3)

 

5. ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ this

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ this λŠ” 일반 ν•¨μˆ˜μ—μ„œ this 와 λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€.

 

μΌλ°˜ν•¨μˆ˜

μΌλ°˜ν•¨μˆ˜μ˜ thisλŠ” μžμ‹ λ§Œμ˜ thisλ₯Ό κ°–κ³  있고,(μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ this 바인딩을 ν•˜κΈ° λ•Œλ¬Έ) ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ μ‹œμ μ—μ„œ 결정이 λœλ‹€. 

즉, 일반 ν•¨μˆ˜μ˜ thisλŠ” ν•¨μˆ˜μ˜ μ„ μ–Έμœ„μΉ˜μ— 상관 없이, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법에 따라 달라진닀. 

(일반 ν•¨μˆ˜μ˜ thisλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 객체λ₯Ό κ°€λ₯΄ν‚¨λ‹€.)

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	console.log(this);
    },
};

object.main();
// 일반 ν•¨μˆ˜μ—μ„œ this λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 객체이닀.
// main ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ κ°μ²΄λŠ” objectμ΄λ―€λ‘œ this λŠ” objectκ°€ λœλ‹€.

 

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

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μžμ‹ λ§Œμ˜ this λ₯Ό κ°–κ³  μžˆμ§€ μ•Šλ‹€. ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ this에 μ ‘κ·Όν•˜λ©΄ μ™ΈλΆ€λ‘œλΆ€ν„° thisλ₯Ό κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜κ²Œ λœλ‹€.

즉, ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ this λŠ” ν•¨μˆ˜μ˜ 호좜 방법에 상관없이, ν•¨μˆ˜λ₯Ό μ„ μ–Έν•œ μœ„μΉ˜μ— μ˜ν•΄ κ²°μ •λœλ‹€.

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ thisλŠ” ν•¨μˆ˜λ₯Ό κ°μ‹ΈλŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ thisλ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ™€μ„œ μ‚¬μš©ν•œλ‹€.

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	console.log(this);
    },
    mainArrow: () => {
    	console.log(this);
    }
};

object.mainArrow(); // window 
// ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μžμ‹ λ§Œμ˜ thisλ₯Ό 갖지 μ•ŠκΈ° λ•Œλ¬Έμ— 밖에 μžˆλŠ” thisλ₯Ό κ°€μ Έμ˜€κ²Œ 되고,(λ°”κΉ₯ μŠ€μ½”ν”„)
// 밖에 μžˆλŠ” this λŠ” μ „μ—­ 객체인 windowκ°€ λ‚˜νƒ€λ‚˜κ²Œ λœλ‹€.

const object2 = {
	name: 'μ½”λ”©',
    mainArrow: object.mainArrow,
};

object2.mainArrow(); // object2의 λ‚΄μš©μ΄ μ•„λ‹Œ, window 객체 λ‚΄μš©μ΄ λ‚˜μ˜€κ²Œ λœλ‹€.
// ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ thisλŠ” ν•¨μˆ˜κ°€ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ μ •μ˜λœλ‹€.
// ν•¨μˆ˜κ°€ 호좜된 λ°©λ²•κ³ΌλŠ” λ¬΄κ΄€ν•˜λ‹€.

 

 

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	const innerFunction = function() {
        	console.log(this)
        };
        innerFunction()
    },
};

object.main() // window 객체가 λ‚˜μ˜¨λ‹€.
//innerFunction() 은 μ–΄λ–€ν•œ 객체 없이 호좜되기 λ•Œλ¬Έμ΄λ‹€.

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	const innerFunction = () => {
        	console.log(this)
        };
        innerFunction()
    },
};

object.main() // object 객체가 λ‚˜μ˜¨λ‹€.
// ν™”μ‚΄ν‘œ ν•¨μˆ˜μΈ innerFunction() 의 this λŠ” 겉에 감싸고 μžˆλŠ” main ν•¨μˆ˜μ˜ thisλ₯Ό κ°€μ Έμ˜€κ²Œ 되고 
// μ΄λŠ” object 이기 λ•Œλ¬Έμ΄λ‹€.

 

6. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” bind μ‚¬μš© λΆˆκ°€

일반 ν•¨μˆ˜μ—μ„  bindλ₯Ό ν™œμš©ν•΄ this 값을 λͺ…μ‹œν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„  thisλ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€. μ™œλƒν•˜λ©΄ 바인딩할 μžμ‹ λ§Œμ˜ this κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	const innerFunction = function() {
        	console.log(this);
        }.bind({hi: 'hi'});
        innerFunction()
    },
};

object.main(); // {hi: 'hi'}

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ this 값은 ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ μ •μ˜ λ˜λŠ” μ‹œμ μ—μ„œ μ •μ˜λ˜λŠ” μœ„μΉ˜μ— μ˜ν•΄ 결정이 되고 μ΄ν›„μ—λŠ” λ³€κ²½λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ 아무리 bind 둜 thisλ₯Ό 정해주더라도 λ¬΄μ‹œν•˜κ²Œ λœλ‹€.

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	const innerFunction = (() => {
        	console.log(this)
        }).bind({hi: 'hi'});
        innerFunction()
    },
};

//object.main() // {name: 'μ½”λ”©', main: f} object 객체가 λ‚˜μ˜¨λ‹€.

 

7. ν™”μ‚΄ν‘œ ν•¨μˆ˜ μ™ΈλΆ€ ν•¨μˆ˜μ˜ 영ν–₯을 받지 μ•ŠλŠ”λ‹€.

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	setTimeout(function() {
        	console.log(this);
        }, 1000)
    },
};

object.main();
//1초 ν›„ window 객체 좜λ ₯ - setTimeout ν•¨μˆ˜μ— thisλŠ” window 객체둜 섀정돼 있음.

const object = {
	name: 'μ½”λ”©',
    main: function () {
    	setTimeout(() => {
        	console.log(this);
        }, 1000)
    },
};

object.main();
// {name: 'μ½”λ”©', main: f} object 객체가 λ‚˜μ˜¨λ‹€.
// ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μžμ‹ μ„ κ°μ‹ΈλŠ” μŠ€μ½”ν”„μ˜ this λ₯Ό κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— 
// setTimeout λ‚΄λΆ€ ꡬ성에 상관없이 λ§Œλ“€μ–΄μ€€ object 객체가 λ‚˜μ˜¨λ‹€.

λŒ“κΈ€