๐Ÿ“ข TIL) Function declaration (ํ•จ์ˆ˜ ์„ ์–ธ์‹)

Solmiiยท2020๋…„ 4์›” 29์ผ
1

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
6/24
post-thumbnail

๐Ÿ”” Function์ด๋ž€?

1. ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๋นŒ๋”ฉ ๋ธ”๋Ÿญ
2. ์„œ๋ธŒ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.
3. ์—ฌ๋Ÿฌ๋ฒˆ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
4. ํ•œ๊ฐ€์ง€์˜ ์—…๋ฌด๋‚˜, ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.


๐ŸŽจ ํ•จ์ˆ˜์˜ ํ˜•ํƒœ

  • function ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜์—ฌ
  • ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ง€์–ด์ฃผ๊ณ 
  • ํ•จ์ˆ˜๋ฅผ ์•Œ๋ฆฌ๋Š” ๊ด„ํ˜ธ (): parentheses ๋ฅผ ์—ด๊ณ  ๋‹ซ๊ณ 
  • ํ•จ์ˆ˜์˜ ์‹œ์ž‘์„ ์•Œ๋ฆฌ๋Š” ์ค‘๊ด„ํ˜ธ {: curly bracket ์„ ์—ด์–ด์ค€๋‹ค.
  • ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
    (ํ•จ์ˆ˜์˜ body๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์— ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋˜์–ด์žˆ๋‹ค. ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ๋Š” ์ฝ”๋“œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์ข‹๊ฒŒ ํ•˜๋ ค๊ณ  ๋ณดํ†ต ๋“ค์—ฌ์“ฐ๊ธฐ ํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค.)
  • return(๋ฐ˜ํ™˜) ํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์ž‘์„ฑํ•œ๋‹ค.
  • ์ค‘๊ด„ํ˜ธ }: curly bracket ๋กœ ๋‹ซ์•„์ค€๋‹ค.

๐Ÿ“ข Function declaration (ํ•จ์ˆ˜ ์„ ์–ธ์‹)

function add(x, y) { //add๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ–๋Š” ํ•จ์ˆ˜ ์ง€์ •, (x, y)๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)
	const result = x + y;
	return result; //๋ฐ˜ํ™˜๊ฐ’(return value)
} //ํ•จ์ˆ˜ ์ •์˜ ๋

add(2, 3); // ์ •์˜ํ•œ ํ•จ์ˆ˜ ๋’ค์— ()๋ฅผ ๋ถ™์—ฌ์„œ ํ˜ธ์ถœ(function call), ()์•ˆ์˜ 2, 3์€ ์ธ์ˆ˜(argument)
  • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•œ๊ฐ€์ง€ ๋™์ž‘๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.
    ( ex : createCardAndPoint โ‡’ createCard / ceatePoint ๋กœ ๊ตฌ๋ถ„)

  • ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ command, verb ํ˜•ํƒœ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
    ( ex : doSomething, printHello )

  • JS์—์„œ ํ•จ์ˆ˜๋Š” object์ด๋‹ค!

    ๋” ์ •ํ™•ํžˆ๋Š”, first class object (1๊ธ‰ ๊ฐ์ฒด)์ด๋‹ค!

    function์€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ณ€์ˆ˜ ์•ˆ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , parameter๋กœ ์ „๋‹ฌ๋„ ๋˜๊ณ , ํ•จ์ˆ˜๋ฅผ returnํ•  ์ˆ˜๋„ ์žˆ๋‹ค!

    ๋˜ํ•œ, function์„ first class function (1๊ธ‰ ํ•จ์ˆ˜)๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ, ๋‹ค์‹œ๋งํ•ด JavaScript์˜ function์€ 1๊ธ‰ ๊ฐ์ฒด์™€ 1๊ธ‰ ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•œ๋‹ค. (๋ณดํ†ต 1๊ธ‰ ๊ฐ์ฒด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.)

    1๊ธ‰ ์‹œ๋ฏผ, ๊ฐ์ฒด, ํ•จ์ˆ˜ ์–˜๊ธฐ๋Š” ์ฐพ์•„๋ณด๋‹ˆ ์ข€ ์žฌ๋ฏธ์žˆ์–ด์„œ ๋”ฐ๋กœ ์ •๋ฆฌํ•ด์„œ ์˜ฌ๋ฆด ์˜ˆ์ •! ๊ทธ๋Ÿฌ๋‹ˆ 1๊ธ‰ ๊ฐ์ฒด,ํ•จ์ˆ˜ ์–˜๊ธฐ๋Š” ์—ฌ๊ธฐ๊นŒ์ง€!

  • JS์—์„œ๋Š” type์ด ์ง€์ •๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ณด๋ฉด ์ด message๊ฐ€ string์„ ์ „๋‹ฌํ•˜๋Š”์ง€, number๋ฅผ ์ „๋‹ฌํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค...๐Ÿ™…๐Ÿปโ€โ™€๏ธ

    โ‡’ type์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”ํ›„์— ๋ฐฐ์šฐ๊ฒŒ ๋  TypeScript์—์„œ type์„ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    โ‡’ ๋ง›๋ณด๊ธฐ๋กœ ์ด ์‚ฌ์ดํŠธ์—์„œ TypeScript๋กœ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ณผ ์ˆ˜ ์žˆ๊ณ , ์ž…๋ ฅํ•œ ์ฝ”๋“œ๋ฅผ JavaScript๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!


1. parametes (๋งค๊ฐœ ๋ณ€์ˆ˜)์™€ argument (์ธ์ž)

return ํ‚ค์›Œ๋“œ(์•„๋ž˜ 3๋ฒˆ์— ์ •๋ฆฌ)๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๋ฉด,
parameter์™€ argument๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•!

function getName(name) {
  return name + '๋‹˜';
}

const result1 = getName('๊ฐœ๋ฐœ์ž'); // ๊ฐœ๋ฐœ์ž๋‹˜
const result2 = getName('๋””์ž์ด๋„ˆ'); // ๋””์ž์ด๋„ˆ๋‹˜
const result3 = getName('๊ธฐํš์ž'); // ๊ธฐํš์ž๋‹˜

์ด ๋•Œ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ธ์ž๋กœ ๋ฐ›์€ ๋ณ€์ˆ˜์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์•ˆ๋œ๋‹ค!

function getName(name) {
  let name = "solmi";
  return name + '๋‹˜';
}

getName("solmi"); // error

์ธ์ž(parameter)์— ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋ ์ง€๋Š” ํ˜ธ์ถœํ•  ๋•Œ ๊ฒฐ์ •ํ•˜๋ฏ€๋กœ, ์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ธ์ž๋กœ ๋ฐ›์€ ๋ณ€์ˆ˜(name)์— ์ƒˆ๋กœ์šด ๊ฐ’("wecode")์„ ๋„ฃ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋œจ๊ฒŒ ๋œ๋‹ค.


  • premitive type parameters : value๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— value๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ, ์ „๋‹ฌ๋ฐ›์€ ์ธ์ž(function์— ์ •์˜๋œ ๋ณ€์ˆ˜)๋Š” ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋ณต์‚ฌ๋œ๋‹ค.

  • object type parameters : value๊ฐ€ ๋‹ด๊ธด reference๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— reference๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.
function changeName(obj) {
	obj.name = "coder";
}
const solmi = {name: "solmi"};
changeName(solmi);
console.log(solmi); // {name : "coder"} ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

object type์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ obj ์•ˆ์— ์žˆ๋Š” name์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
=>premitive type parameters์ด๋ž‘ object type parameters์ด ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.... ๋” ๊ณต๋ถ€ํ•ด์„œ ์ถ”๊ฐ€ํ•˜๊ฒ ์Œ


function reassign(x) {
  x = 2;
  return x;
}

const y = 1;
const result = reassign(y); //์ด๋ฏธ ์ง€์ •๋œ ํ•จ์ˆ˜์— ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•ด๋„

console.log(y); // 1 ์ถœ๋ ฅ
console.log(result); // 2 ์ถœ๋ ฅ => ๊ฒฐ๊ณผ๊ฐ’์€ ๋จผ์ € ์ •์˜๋œ ํ•จ์ˆ˜์ธ reassign(x)๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฐ”๊นฅ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€๋Š” ๊ด€๊ณ„์—†๋Š” ๋…๋ฆฝ์ ์ธ ๋ณ€์ˆ˜!

Default parameter

  • ES2015(ES6)๋ถ€ํ„ฐ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
function showMessage(message, from) {
	if (from === undefined) {
		from = "unknown";
	}
	console.log(`${message} by ${from};
}
showMessage("hi!"); //hi! by unknown ์ถœ๋ ฅ

Default parameter๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์ „์—๋Š”, message๋งŒ ์ง€์ • ํ•˜๊ณ  from์€ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด์„œ if ํ•จ์ˆ˜๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์คฌ์–ด์•ผ ํ–ˆ๋Š”๋ฐ,

function showMessage(message, from = "unknown") {
	console.log(`${message} by ${from};
}
showMessage("hi!"); //hi! by unknown ์ถœ๋ ฅ

ES6๋ถ€ํ„ฐ๋Š”, ํŒŒ๋ผ๋ฏธํ„ฐ ์˜†์— = ์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ด ๋†“์œผ๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์„ ๋•Œ, ๊ธฐ๋ณธ๊ฐ’์ด ์ž๋™์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.


Rest parameter

  • ES2015(ES6)๋ถ€ํ„ฐ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
function printAll(...args) { //AA, BB, CC๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐฐ์—ด์ด ๋œ๋‹ค.
	for (let i = 0; i < args.length; i++) {
		console.log(args[i]);
	}
}
printAll("AA", "BB", "CC"); //AA, BB, CC๊ฐ€ ๊ฐ๊ฐ ์ถœ๋ ฅ๋œ๋‹ค.

...์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์œ„ ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉํ•œ printAll ํ•จ์ˆ˜ ๊ฐ„๋‹จํ•˜๊ฒŒ ์“ฐ๊ธฐ!

์œ„์—์„œ๋Š” (...args) ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด for....i < args....i++....๋ฅผ ์ด์šฉํ•ด ๋ณต์žกํ•˜๊ฒŒ ์ผ์ง€๋งŒ, ์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ์ธ์ž๋“ค์„ ๋‹จ์ˆœ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ์—๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

function printAll(**...**args) {
	for (const arg of args) {
		console.log(arg);
	}
}
printAll("AA", "BB", "CC");

for of ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ด๋ ‡๊ฒŒ๋„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

function printAll(**...**args) {
	args.forEach((arg) => console.log(arg));
}
printAll("AA", "BB", "CC");

forEach๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ ‡๊ฒŒ ๋” ์งง๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค!
(๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚˜์ค‘์— ๋‹ค์‹œ ์ •๋ฆฌํ•˜๊ฒ ์Œ!)


๐Ÿคช ๋งค๊ฐœ ๋ณ€์ˆ˜(parameter)์™€ ์ „๋‹ฌ ์ธ์ž(argument)๊ฐ€ ์ •ํ™•ํžˆ ๋ญ”์ง€ ํ—ท๊ฐˆ๋ ค์„œ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค....

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ์ „๋‹ฌ ์ธ์ž๋ฅผ ์ ๋‹นํžˆ ์„ž์–ด ์“ฐ๊ธฐ๋„ ํ•˜๊ณ , ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ์˜๋ฏธ๋ฅผ ๋‹ฌ๋ฆฌ ํ•ด์„ํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ... ์—„๋ฐ€ํžˆ ๋งํ•ด์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ์ •์˜๋ถ€๋ถ„์— ๋‚˜์—ด๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ „๋‹ฌ์ธ์ž๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์ „๋‹ฌ๋˜๋Š” ์‹ค์ œ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋Ÿฐ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜(variable)๋กœ, ์ „๋‹ฌ์ธ์ž๋Š” ๊ฐ’(value)์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.


2. Scope

  • ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ์˜ ์ผ์ • ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค. ์Šค์ฝ”ํ”„(scope)๋ž€, ํŠน์ • ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•œ ์ฝ”๋“œ ์ƒ์˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋งํ•œ๋‹ค.
    โ‡’ ๋ฐ–์—์„œ๋Š” ์•ˆ์ด ๋ณด์ด์ง€ ์•Š๊ณ , ์•ˆ์—์„œ๋งŒ ๋ฐ–์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฌํŒ… ๋œ ์œ ๋ฆฌ์ฐฝ!
let globalMessage = "global" // global variable

function printMessage() {
	let message = "hello";
	console.log(message); // local variable
	console.log(globalMessage); // ์•ˆ์—์„œ๋Š” ๋ฐ–์„ ๋ณผ์ˆ˜์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ–์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋„ ์ถœ๋ ฅ๋œ๋‹ค = Scope
}
printMessage(); //
console.log(message); //error => ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ฐ–์—์„œ ์ถœ๋ ฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
  • { }๋ธ”๋Ÿญ ์•ˆ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด, ์ง€์—ญ ๋ณ€์ˆ˜(local variable)๊ฐ€ ๋œ๋‹ค.
  • ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜์—์„œ๋„ Scope๊ฐ€ ์ ์šฉ๋œ๋‹ค!
    (์ž์‹ ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ ํ•จ์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ทธ ๋ฐ˜๋Œ€ ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€๋Šฅ = ์ด๋ฅผ closer๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ด๊ฑด ๋‹ค์Œ์— ๋” ์ž์„ธํžˆ ์ •๋ฆฌํ•˜๊ธฐ๋กœ...)

Scope Chain (์Šค์ฝ”ํ”„ ์—ฐ์‡„)

  • ์ฝ”๋“œ๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋‹ค๊ฐ€, ์‹๋ณ„์ž์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด ์‹๋ณ„์ž์˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋ฅผ ํ˜„์žฌ ์Šค์ฝ”ํ”„์—์„œ ์ฐพ๋Š”๋‹ค.

    โ‡’ ํ˜„์žฌ ์Šค์ฝ”ํ”„์—์„œ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, ๋ฐ”๊นฅ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ์„œ๋„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๊ทธ ๋‹ค์Œ ์Šค์ฝ”ํ”„๋ฅผ.....์ด๋ฅผ ๊ฐ€์žฅ ๋ฐ”๊นฅ์— ์žˆ๋Š” ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ์Šค์ฝ”ํ”„ ์—ฐ์‡„๋ผ๊ณ  ํ•œ๋‹ค.

  • ๊ฐ€์žฅ ๋ฐ”๊นฅ์— ์žˆ๋Š” ์Šค์ฝ”ํ”„๋Š” ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„(top-level scope), ์ „์—ญ ์Šค์ฝ”ํ”„(global scope)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.


3. Return a value (๋ฐ˜ํ™˜๊ฐ’)

function add(x, y) {
  return x + y;
  console.log('Hello');
}
add(1, 2); // 3 ์ถœ๋ ฅ, Hello๋Š” ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

return ์€ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฒฐ์ •ํ•œ๋‹ค. return ํ‚ค์›Œ๋“œ ๋ฐ”๋กœ ๋‹ค์Œ์— ์˜ค๋Š” ๊ฐ’์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ๋ฐ˜ํ™˜๋˜๋Š” ์ฆ‰์‹œ ํ•จ์ˆ˜ ์‹คํ–‰์ด ๋๋‚œ๋‹ค.

โ‡’ ๊ทธ๋ž˜์„œ ์œ„์˜ ์˜ˆ์ œ์—์„œ console.log('Hello'); ๋Š” return ๋’ค์— ์ž‘์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

function returnUndefined() {
  return; // return ๋’ค์— ์•„๋ฌด๊ฒƒ๋„ ์จ์ฃผ์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ undefined์ด ๋“ค์–ด๊ฐ„๋‹ค.
}
function noReturn() {} //return์„ ์•„์˜ˆ ์จ์ฃผ์ง€ ์•Š์•„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

returnUndefined(); // undefined
noReturn(); // undefined

return ๋’ค์— ์•„๋ฌด ๊ฐ’๋„ ์จ์ฃผ์ง€ ์•Š๊ฑฐ๋‚˜, ์•„์˜ˆ return ๊ตฌ๋ฌธ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ธ return undefined; ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

const name = myName();

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์€ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ๋กœ์ง์— ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Early return, Early exit

function upgradeUser(user) {
	if (user.point > 10) {
		๋Œ€์ถฉ ์—„์ฒญ ๊ธธ๊ณ  ๋ณต์žกํ•œ logic...
	}
}

๋งŒ์•ฝ, user์˜ point๊ฐ€ 10 ์ด์ƒ์ผ๋•Œ๋งŒ ๋ฌด์–ธ๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋‹ค๋ฉด, ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ์™„์ „ bad bad๐Ÿ™…๐Ÿปโ€โ™€๏ธ!!

{ } ์•ˆ์—์„œ ๊ธธ๊ณ  ๋ณต์žกํ•œ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค!

function upgradeUser(user) {
	if (user.point <= 10) {
		return;
	}
	๋Œ€์ถฉ ์—„์ฒญ ๊ธธ๊ณ  ๋ณต์žกํ•œ logic...
}

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ, ์กฐ๊ฑด์ด ๋งž์ง€ ์•Š์„๋•Œ๋Š” ๋น ๋ฅด๊ฒŒ return ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๊ณ , ๋ณต์žกํ•œ ๋กœ์ง์€ ๊ทธ ๋’ค์— ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ๋” ์ข‹๋‹ค!!


๐Ÿค™ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ

ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ถ€๋ฅด๋ฉด, ํ•จ์ˆ˜ ๋‚ด์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

function checkCorrect() {
  let hi = "์•ˆ๋…•ํ•˜์„ธ์š”";
  
  return hi;
} // ํ•จ์ˆ˜ ์ •์˜ (checkCorrect ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š” ๊ฒƒ์ธ์ง€)

checkCorrect(); // ํ•จ์ˆ˜ ํ˜ธ์ถœ(์‹คํ–‰) ( checkCorrect ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ถ€๋ฅด๊ธฐ ์ „๊นŒ์ง€๋Š” hi ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋„ ์•Š๊ณ , ์•ˆ๋…•ํ•˜์„ธ์š”! ๋ผ๋Š” ๋ง๋„ ์•ˆ๋œฌ๋‹ค.)

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ์ด๋ฆ„์— ๊ด„ํ˜ธ ()๋ฅผ ์—ฌ๋‹ซ์•„์ฃผ๋ฉด ๋œ๋‹ค.

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ

function getTax(price) {
  return price * 0.1;
}

function calculateTotal(price) {
  return price + getTax(price); // ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜ธ์ถœ
} // ์—ฌ๊ธฐ๊นŒ์ง€ "์ด๋Ÿฐ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค~" ํ•˜๊ณ  ๋ณ€์ˆ˜ ์„ ์–ธ

const result = calculateTotal(3500); // ํ•จ์ˆ˜ ํ˜ธ์ถœ => ์‹ค์ œ๋กœ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ 
console.log(result); // 3850
console.log(calculateTotal(4000)); // 4400
profile
ํ•˜๋ฃจ๋Š” ์น˜์—ดํ•˜๊ฒŒ ์ธ์ƒ์€ ์—ฌ์œ ๋กญ๊ฒŒ

0๊ฐœ์˜ ๋Œ“๊ธ€