๐Ÿ“† 2025.04.21 โ€ 2025.04.22 โ€ Function invocation [๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ๋ถ€ํŠธ์บ ํ”„ ํ”„๋ก ํŠธ์—”๋“œ13๊ธฐ]

rogieยท2025๋…„ 4์›” 22์ผ

likelion-posting

๋ชฉ๋ก ๋ณด๊ธฐ
7/10

๐Ÿง  ๋ฐฐ์šด ์  & ์ •๋ฆฌ

  • ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ

    • ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•

    • ํ•จ์ˆ˜();

    • this ๋Š” window ๊ฐ์ฒด

      • window ๊ฐ์ฒด๋Š” ์–ด๋””์„œ๋‚˜ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ this๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์Œ
      function f1(){
        console.log(this);
        this.alert();
        window.alert();
        alert();
      };
      f1();
      
      const f2 = function(){
        console.log(this);
      };
      f2();

  • ๋ฉ”์„œ๋“œ

    • ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ

      • ๊ฐ์ฒด์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ

      • ๊ฐ์ฒด ๋ฉ”์„œ๋“œ๋ช…

      • this ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ๊ฐ์ฒด

        • this ๋Š” ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ๊ฐ์ฒด์— ์ข…์†์ ์ธ ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š”๊ฒŒ๊ฐ€๋Šฅ
        • ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ๋ฉ”์„œ๋“œ๋กœ ์‚ฌ์šฉ
        • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ค‘์š”ํ•œ ํŠน์ง•
        window.name = "global"; // window ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ „์—ญ ๊ฐ์ฒด
        global.name = "global"; // node.js๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ „์—ญ ๊ฐ์ฒด
        globalThis.name = "global"; // ๋ธŒ๋ผ์šฐ์ €๋ฉด window๋กœ ์ธ์‹ํ•˜๊ณ  node.js๋Š” global๋กœ ์ธ์‹ํ•จ
    • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ํ˜ธ์ถœ

      • ์ผ๋ฐ˜ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— arguments ๋‚˜ this ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์˜ arguments, this ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ
      const getPingName = () => {
        console.log(this);
        return this.name;
      };
      
      const ping1 = { name: '๋ฐ”๋กœํ•‘', age: 11, getName: getPingName };
      const ping2 = { name: '๋ผ๋ผํ•‘', age: 9, getName: getPingName };
      
      console.log(baro.age, baro.getName());
      console.log(rara.age, rara.getName());

  • apply(), call()

    • apply(), call() ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ
      • ํ•จ์ˆ˜์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ
      • ํ•จ์ˆ˜๋ช….apply(), ํ•จ์ˆ˜๋ช….call() ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ
      • this ๋Š” apply(), call() ๋ฉ”์†Œ๋“œ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด
      • this ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
      • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ฃผ๋กœ ์‚ฌ์šฉ
    • apply(p1, p2)
      • ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง
      • ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ (p1) ์—๋Š” this ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ โ‡’ ์ƒ๋žต๊ฐ€๋Šฅ
      • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ (p2) ์—๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ธ์ž๊ฐ’ ๋ฐฐ์—ด โ‡’ ์ƒ๋žต๊ฐ€๋Šฅ
      • ๋‹จ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์œผ๋กœ ๋“ค์–ด๊ฐ€์•ผํ• ๋•Œ๋Š” p2๋ฅผ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•œ๋‹ค
        • ex02-05.js

          function add(x, y) {
            console.log(this);
            return x + y;
          }
          
          console.log(add.apply({ name: "apply" }, [100, 10])); // this๋Š” {name: "apply"}
          // ์ถœ๋ ฅ ๊ฒฐ๊ณผ {name: "apply"}
          // x= 100, y=10 => x + y = 100 + 10 = 110

          image

        • ex02-15.js

          globalThis.name = "global"; // ๋ธŒ๋ผ์šฐ์ €๋ฉด window๋กœ ์ธ์‹ํ•˜๊ณ  node.js๋Š” global๋กœ ์ธ์‹ํ•จ
          
          const getPingName = function () {
            return this.name;
          };
          
          const baro = new Object();
          baro.name = "๋ฐ”๋กœํ•‘";
          baro.age = 9;
          baro.getName = getPingName;
          
          const rara = {
            name: "๋ผ๋ผํ•‘",
            age: 8,
            getName: getPingName,
          };
          
          // ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• 1 - ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ(this๋Š” window)
          console.log(getPingName());
          
          // ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• 2 - ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ(this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ๊ฐ์ฒด, this๋Š” baro )
          console.log(baro.age, baro.getName()); // getName์˜ this๋Š” baro
          console.log(rara.age, rara.getName()); // getName์˜ this๋Š” rara
          
          console.log("=========================================");
          console.log(baro.getName(), baro.getName.apply(rara)); 
          // this๋Š” ๊ฐ๊ฐ     baro,     rara
    • call(p1, p2, p3, โ€ฆ)
      • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง
      • ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ (p1) ์—๋Š” this ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ
      • ๋‘ ๋ฒˆ์งธ ์ดํ›„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ (p2, p3, โ€ฆ) ์—๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ธ์ž๊ฐ’์„ ์ฐจ๋ก€๋Œ€๋กœ์ง€์ •
        • ex02-05.js

          function add(x, y) {
            console.log(this);
            return x + y;
          }
          console.log(add.call({ name: "call" }, 60, 10)); // this๋Š” {name: "call"}
          // ์ถœ๋ ฅ ๊ฒฐ๊ณผ {name: call}
          // x= 60, y=10 => x + y = 60 + 10 = 70

          image

        • ex02-15.js

          globalThis.name = "global"; // ๋ธŒ๋ผ์šฐ์ €๋ฉด window๋กœ ์ธ์‹ํ•˜๊ณ  node.js๋Š” global๋กœ ์ธ์‹ํ•จ
          
          const getPingName = function () {
            return this.name; // ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์˜ name ์†์„ฑ์„ ๋ฐ˜ํ™˜ํ•จ
          };
          
          const baro = new Object(); // ๋ฐ”๋กœ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
          baro.name = "๋ฐ”๋กœํ•‘"; // name ์†์„ฑ ์„ค์ •
          baro.age = 9; // age ์†์„ฑ ์„ค์ •
          baro.getName = getPingName; // getPingName ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ํ• ๋‹น
          
          const rara = { // rara๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ฆ
            name: "๋ผ๋ผํ•‘", // ์ด๋ฆ„
            age: 8, // ๋‚˜์ด
            getName: getPingName, // ๋‚˜์˜ ์ด๋ฆ„
          };
          
          // ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• 1 - ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ(this๋Š” window)
          console.log(getPingName());  // this.name => global
          
          // ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• 2 - ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ(this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ๊ฐ์ฒด, this๋Š” baro )
          console.log(baro.age, baro.getName()); // getName์˜ this๋Š” baro
          console.log(rara.age, rara.getName()); // getName์˜ this๋Š” rara
          
          // call์„ ์‚ฌ์šฉํ•˜์—ฌ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •
          console.log("=========================================");
          console.log(getPingName(), getPingName.call(baro), getPingName.call(rara));
          // this๋Š”  window,                          baro,                   rara
    • ๋ฐฐ์—ด์˜ push() ๋ฉ”์„œ๋“œ ๊ธฐ๋Šฅ
      • ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์— ์ง€์ •ํ•œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
      • this๋กœ ์ง€์ •๋œ Array ๊ฐ์ฒด์˜ length ์†์„ฑ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์†์„ฑ์„ ๋งŒ๋“ค๊ณ  ์ง€์ •ํ•œ ์š”์†Œ๋ฅผ ์ €์žฅํ•œ ํ›„ length๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    • Array์˜ push() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋™์ž‘์‹œํ‚ค๊ธฐ
      • length ์†์„ฑ ์ถ”๊ฐ€
      • Array.prototype.push.call(๊ฐ์ฒด, ์ถ”๊ฐ€ํ•  ์š”์†Œ) โ‡’ ex01-28.js

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜

    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ (๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜ ํด๋ž˜์Šค์™€ ๋น„์Šท) ํ˜ธ์ถœ

      • ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
        • new ํ•จ์ˆ˜๋ช…()
        • this๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด
    • ์ƒ์„ฑ์ž๋กœ ํ˜ธ์ถœ๋  ๋•Œ์˜ ๋‚ด๋ถ€ ๋™์ž‘ (ex02-19.js)

      /*
      ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ๋ฒ• 4 ์ƒ์„ฑ์ž ํ•จ์ˆ˜
      */
      
      globalThis.name = "global"; // ๋ธŒ๋ผ์šฐ์ €๋ฉด window๋กœ ์ธ์‹ํ•˜๊ณ  node.js๋Š” global๋กœ ์ธ์‹ํ•จ
      
      const getPingName = function () {
        return this.name;
        // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด this๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ
      };
      
      // ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜(์ƒ์„ฑ์ž)
      function Ping(name, age) {
        this.name = name;
        this.age = age;
        this.getName = function () {
          return this.name;
        };
      }
      
      /**
       * new์˜ ๋™์ž‘
        * 1. ๋นˆ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” this ์ƒ์„ฑ
        * 2. this๋ฅผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ „๋‹ฌ
        * 3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด this๋ฅผ ์ž๋™์œผ๋กœ ๋ฆฌํ„ด
        */
      const baro = new Ping("๋ฐ”๋กœํ•‘", 7);
      const rara = new Ping("๋ผ๋ผํ•‘", 8);
      const copyPing = new Ping("์นดํ”ผํ•‘", 12);
      
      baro.age++;
      rara.age++;
      
      console.log("์ด ํ•‘์˜ ์ด๋ฆ„์€:", baro.getName(), "| ๋‚˜์ด๋Š”:", baro.age); // getName์˜ this๋Š” baro
      console.log("์ด ํ•‘์˜ ์ด๋ฆ„์€:", rara.getName(), "| ๋‚˜์ด๋Š”:", rara.age); // getName์˜ this๋Š” rara
      console.log("์ด ํ•‘์˜ ์ด๋ฆ„์€:", copyPing.getName(), "| ๋‚˜์ด๋Š”:", copyPing.age); // getName์˜ this๋Š” copyPing
      
      • ๋น„์–ด์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ
      const baro = new Ping("๋ฐ”๋กœํ•‘", 7);

      new Ping(...)์„ ํ˜ธ์ถœํ•˜๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ

      this = {} ์™€ ๊ฐ™์€ ๋น„์–ด ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•œ๋‹ค.


      • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” this ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ „๋‹ฌ
      function Ping(name, age) {
        this.name = name;
        this.age = age;
        this.getName = function () {
          return this.name;
        };
      }

      ์œ„์—์„œ ๋งŒ๋“ค์–ด์ง„ this = {}๋Š”

      Ping ํ•จ์ˆ˜ ์•ˆ์œผ๋กœ this๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋“ค์–ด๊ฐ

      ๊ทธ๋Ÿฐ ๋‹ค์Œ this.name, this.age ๊ฐ™์€ ์†์„ฑ๋“ค์ด ์ฑ„์›Œ์ง


      • ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
      // Ping ํ•จ์ˆ˜์—๋Š” return์ด ์—†์Œ

      Ping ํ•จ์ˆ˜๋Š” ๋ช…์‹œ์ ์œผ๋กœ return์„ ํ•˜์ง€ ์•Š์Œ โ†’

      ๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ this ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•จ

      ์ฆ‰, baro ๋ณ€์ˆ˜์—๋Š” { name: "๋ฐ”๋กœํ•‘", age: 7, getName: function }์ด ์ €์žฅ๋จ


      • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์˜ new ์—ฐ์‚ฐ์ž์™€ ๋น„์Šทํ•œ ๋™์ž‘
      const baro = new Ping("๋ฐ”๋กœํ•‘", 7);

      ์ด ์ „์ฒด ํ๋ฆ„์€ Java, C++ ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ์˜ new์™€ ์œ ์‚ฌํ•จ

      ์ฆ‰, new๋Š” ๊ฐ์ฒด ์ƒ์„ฑ + ์ดˆ๊ธฐํ™” + ๋ฐ˜ํ™˜๊นŒ์ง€ ํ•œ ๋ฒˆ์— ํ•ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ์•ผ

    • ์ƒ์„ฑ์ž๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ๋“ค

      • ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Ÿด ๊ฒฝ์šฐ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์˜ this๋Š” window ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ๊ฐ์ฒด์— ์ข…์†์ ์ธ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.
      • ๋ช…๋ช…(naming) ๊ทœ์น™
        • ์ผ๋ฐ˜ ํ•จ์ˆ˜: ์ž‘์—…ํ•œ ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋™์‚ฌ๋กœ ์ด๋ฆ„ ์ง“๊ณ  ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘
        • ์ƒ์„ฑ์ž: ์ƒ์„ฑํ•  ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ช…์‚ฌ๋กœ ์ด๋ฆ„ ์ง“๊ณ  ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘

๐Ÿ”— ๋ฐฐ์› ๋˜ ํŒŒ์ผ


โ“ ์ƒ๊ธด ์งˆ๋ฌธ / ๋” ์•Œ์•„๋ณผ ๊ฒƒ

  • this...๊ทธ๋†ˆ์˜ this... ๋”ฅ๋‹ค์ด๋ธŒ ์—ด์‹ฌํžˆ ๋ณด๋ฉด์„œ ํ•ด๊ฒฐํ•ด์•ผ๊ฒ ๋‹ค...

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ

profile
front-end๋ฅผ ๊ฟˆ๊ฟ‰๋‹ˆ๋‹ค

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