Skip to content

[JS] ํ•จ์ˆ˜

JueunPark edited this page May 31, 2022 · 1 revision

ํ•จ์ˆ˜๋ž€?

  • ํ•จ์ˆ˜๋Š” this, ๋ฉ”์„œ๋“œ, ํ”„๋กœํ† ํƒ€์ž…, ๋ชจ๋“ˆํ™”, ์Šค์ฝ”ํ”„, ์‹คํ–‰ ์ปจํƒ์ŠคํŠธ, ์ฝœ๋กœ์ € ๋“ฑ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ต์‹ฌ๊ฐœ๋…๊ณผ ๊นŠ์€ ๊ด€๋ จ์ด ์žˆ์Œ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ํ•„์š”ํ•จ
  • ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์˜ ํŽธ์˜์„ฑ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ด
  • ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ž„(์ผ๊ธ‰ ๊ฐ์ฒด)
  • ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ ์ ์€ callable ํ•˜๋‹ค๋Š” ๊ฒƒ => ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[ Call ]]๊ณผ ๊ด€๋ จ
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” callableํ•˜๋ฉด์„œ ๋™์‹œ์— constructor์ž„ => ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[ Construct ]]๊ณผ ๊ด€๋ จ
    -> ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ํ™•์ธํ•˜๊ธฐ1: console.dir(ํ•จ์ˆ˜์ด๋ฆ„)
    -> ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ํ™•์ธํ•˜๊ธฐ2: ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ๋“ค์˜ ์„ค๋ช…์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์‚ฌ์šฉํ•ด์„œ ์ฐ์–ด๋ณด๊ธฐ
  • ES6์ด์ „์˜ ํ•จ์ˆ˜๋“ค์€ ๋ชจ๋‘ callableํ•˜๋ฉด์„œ ๋™์‹œ์— constructor์ด์—ˆ์œผ๋‚˜ ES6๋ถ€ํ„ฐ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์‹œ์ž‘ํ•จ

ํ•จ์ˆ˜์˜ ์ •์˜ ๋ฐฉ์‹

  • ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•˜๋Š” ์ด์œ 
    • ์„ ์–ธ๊ณผ ์ •์˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด: ๋ฉ”๋ชจ๋ฆฌ์˜ ํ• ๋‹น ์—ฌ๋ถ€
    • ํ•จ์ˆ˜ ์ •์˜ ๊ณผ์ •
      1. ํ‰๊ฐ€๊ณผ์ •์—์„œ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์˜ ์‹๋ณ„์ž๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋จ
      2. ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋จ(๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ)
      • ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋Š” ์„ ์–ธํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•˜์ง€ ์•Š๊ณ  ์ •์˜ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•จ
      • ECMAScript์—์„œ๋„ ๋ณ€์ˆ˜์—๋Š” ์„ ์–ธํ•œ๋‹ค, ํ•จ์ˆ˜์—๋Š” ์ •์˜ํ•œ๋‹ค๋Š” ํ‘œํ˜„์„ ์”€

ํ•จ์ˆ˜ ํ‘œํ˜„์‹๊ณผ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

  • ํ•จ์ˆ˜๋ฆฌํ„ฐ๋Ÿด๋กœ ์ •์˜ํ•œ ๊ฒฝ์šฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ด๋ฅผ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ/ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ํ•ด์„ํ•œ๋‹ค.

  • ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜๋Š๋ƒ ์•„๋‹ˆ๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง

  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ: ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
    ์˜ˆ: function b(){};

    • ํ‰๊ฐ€๊ณผ์ •์—์„œ b๋ผ๋Š” ํ•จ์ˆ˜๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ(์—”์ง„์ด b๋ฅผ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•จ, b๋Š” ์›๋ž˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹๋ณ„์ž์ž„)
    • ์„ ์–ธ๋ฌธ ์ด์ „์— ํ˜ธ์ถœ์„ ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Œ => ๋กœ์ง์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ถŒ์žฅx
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹: ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
    ์˜ˆ: var c = function d(){};

    • ํ‰๊ฐ€๊ณผ์ •์—์„œ c๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋จ(var์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ›„ undefined๋กœ ์ดˆ๊ธฐํ™”)
    • ์„ ์–ธ๋ฌธ ์ด์ „์— ํ˜ธ์ถœํ•˜๋ฉด TypeError ๋ฐœ์ƒ(undefined ์ƒํƒœ)
    • ํ• ๋‹น๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— (๋Ÿฐํƒ€์ž„) function d๊ฐ€ c์— ํ• ๋‹น ๋จ

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(ES6) arrow function

์˜ˆ: let func = (arg1, arg2, ...argN) => expression => ํ•ญ์ƒ ์ต๋ช… ํ•จ์ˆ˜

  • ๊ธฐ์กด ํ•จ์ˆ˜์™€ ๋‹ค๋ฅธ ์ 
    constructor๊ฐ€ ๋  ์ˆ˜ ์—†์Œ => ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์— [[ Construct ]]๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ
    แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-05-18 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 03 17
  1. ๊ฐ„๋žตํ™”๋œ ํ‘œํ˜„(=> fat arrow)
  2. this ๋ฐ”์ธ๋”ฉ
  • ์›๋ž˜ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ this ๋ฐ”์ธ๋”ฉ์ด ๊ฒฐ์ •๋จ(๋™์ )

    • ์ผ๋ฐ˜ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ: ์ „์—ญ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ(strict mode์—์„œ๋Š” undefined๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋จ)
    • ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ: ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด(abc.print()์˜ ๊ฒฝ์šฐ print๋ฉ”์†Œ๋“œ์˜ this๋Š” abc๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ)
    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ: ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋ฏธ๋ž˜์— ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค(const add = new Func()์˜ ๊ฒฝ์šฐ add)
  • ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ์˜ this ๋ฐ”์ธ๋”ฉ ๋ฌธ์ œ

class Person { // ํด๋ž˜์Šค ๋‚ด๋ถ€๋Š” strict mode๋กœ ์‹คํ–‰๋จ
  constructor(name) {
    this.name = name;
  }

  announce(arr) {
    console.log(this); // ์—ฌ๊ธฐ์„œ this๋Š” jueun ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
    const that = this; // this๋ฅผ ํšŒํ”ผ์‹œํ‚ด
    // map์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ
    return arr.map(function (item) {
      // return `Hi ${item}, my name is ${that.name}.`; // ํšŒํ”ผ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
      // return `Hi ${item}, my name is ${this.name}.`; // Q: ๊ฒฐ๊ณผ๋Š”?
    });
  }
}
this.name = "error"; // ์ „์—ญ์— ๋“ฑ๋ก
const jueun = new Person("jueun");
const greeting = jueun.announce(["a", "b", "c", "d"]);
console.log(greeting);
  • ์ด๊ฒƒ์„ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ(์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ)
    // map์— ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ
    // return arr.map((item) => {
    //   return `Hi ${item}, my name is ${this.name}.`;
    // });
  1. prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์Œ. ์ฆ‰, non-constructor์ž„
    func : ํ™”์‚ดํ‘œํ•จ์ˆ˜
    add : ํ•จ์ˆ˜์„ ์–ธ๋ฌธ
    แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-05-18 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 13 33

    • ์ด prototype ํ”„๋กœํผํ‹ฐ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋งŒ ๊ฐ€์ง
    • ์ด ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๋™์ž‘๊ณผ ๊ด€๋ จ์žˆ๋Š” ๊ฐ์ฒด์ž„(์ƒ์†์— ์‚ฌ์šฉ๋จ)
  2. arguments ๊ฐ์ฒด ์ƒ์„ฑ x
    arguments ๊ฐ์ฒด mdn

function func1(a, a, a) {
  console.log(arguments[0]);
  // expected output: 1

  console.log(arguments[1]);
  // expected output: 2

  console.log(arguments[2]);
  // expected output: 3
}

const arrow1 = (a,a,a) => {}; // Error: Duplicate parameter name not allowed in this context

const arrow2 = (a) => {
 console.log(arguments[0]);
};

func1(1, 2, 3);
arrow2(1);

โ‡’ ์ข€ ๋” ๊ฐ„๋žตํžˆ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ธฐ์กด์˜ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ•์€ ์•„๋‹˜(๋‹ค๋ฅธ ๋ฐฉ๋ฒ•)


[์ฐธ๊ณ ]

์ผ๊ธ‰๊ฐ์ฒด

์ผ๊ธ‰๊ฐ์ฒด์˜ ์˜๋ฏธ

  • ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์—๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•จ
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ type์„ ์ „๋‹ฌ/๋ฐ˜ํ™˜/ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ => ํ•ด๋‹น type์„ ์ผ๊ธ‰๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ

์ผ๊ธ‰๊ฐ์ฒด์˜ ์กฐ๊ฑด

  1. ํ• ๋‹น ๊ฐ€๋Šฅ(๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ)
  2. ์ „๋‹ฌ ๊ฐ€๋Šฅ(ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ)
  3. ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ(ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ)

"ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰๊ฐ์ฒด๋ผ์„œ ์ข‹์€ ์ ์€?" => flexibility! ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ

  • ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋กœ ํ• ๋‹นํ•˜๋Š” ๋“ฑ flexible ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ(์ด๋ฒคํŠธ์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ „๋‹ฌ ๋“ฑ)
function showText(e) {
    //show specific text
}
$('form').on('submit',showText);
$('a').on('click',showText);
  • ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ฐจ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง
    • Higher-order function: ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜์‹คํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•จ์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • ์ผ๊ธ‰๊ฐ์ฒด ์†์„ฑ๊ณผ ํด๋กœ์ € ๋•Œ๋ฌธ์— ์ปค๋ง๊ณผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๊ฐ€๋Šฅํ•ด์ง

Clone this wiki locally