ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€
    ์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ 2023. 2. 26. 18:34

    TLDR;

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

    ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚œ๋‹ค. ์ฆ‰, ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์‹๋ณ„์ž๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ƒ์„ฑ๋œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ( ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…๊ณผ ๋‹ค๋ฅด๊ฒŒ undefined๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.)
    ๋ฐ˜๋ฉด, ํ•จ์ˆ˜ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์—ฌ ํ• ๋‹น๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

    ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ์ฐจ์ด

    1. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์ž์ฒด์˜ this ๋ฐ”์ธ๋”ฉ์„ ๊ฐ–์ง€ ์•Š์•„์„œ, ํ™”์‚ดํ‘œ ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ this๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•œ๋‹ค. ์ด๋ฅผ lexical this๋ผ๊ณ  ํ•œ๋‹ค.
    2. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” constructor๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, new์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    3. arguments๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.

    ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ vs ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ

    this๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘๋™๋ฐฉ์‹์— ๋”ฐ๋ผ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ๊ฒƒ์„ ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ, call,apply,bind๋“ฑ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•ด ์ฃผ๋Š” ๊ฒƒ์„ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

    ๋ณธ ๊ธ€์—์„œ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์ฐจ์ด 3๊ฐ€์ง€๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

    1. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” this๊ฐ€ ์—†๋‹ค.

    ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€๋Š” ๋‹ฌ๋ฆฌ '๊ณ ์œ ํ•œ' this๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค. ๋งŒ์•ฝ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ์‹๋ณ„์ž์ฒ˜๋Ÿผ ์Šค์ฝ”ํ”„์ฒด์ธ์„ ํ†ตํ•ด ์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ this๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

    const obj = {
        say() {
          console.log(this); // [object Object]
          const f = function() { console.log(this); }; // [object Window]
          f();
          const g = () => { console.log(this); } // [object Object]
          g();
        }
    };
    obj.say();

    1) ์œ„์˜ ์ฝ”๋“œ์—์„œ ์ฒซ๋ฒˆ์งธ this์˜ ๊ฒฝ์šฐ, obj๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

    2) ๋‘ ๋ฒˆ์งธ๋กœ ๋ฉ”์„œ๋“œ์•ˆ์—์„œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•œ ๊ฒฝ์šฐ this๋Š” ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

    3) ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ํ™”์‚ดํ‘œ ์•ˆ์—์„œ ์ •์˜ํ•œ ๊ฒฝ์šฐ this๋Š” ๋ณ„๋„๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์˜ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์ธ sayํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” this์ธ obj๋ฅผ ๋™์ผํ•˜๊ฒŒ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

     

    ์ด๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด์ฒ˜๋Ÿผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ this์— ์ ‘๊ทผํ•˜๋ฉด ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ํ™œ์šฉํ•ด์„œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋™์ผ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ˆœํšŒํ•  ๋•Œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    [ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์‹œ]
    ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— this.title์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฐ–์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ธ showList๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ๊ณผ ๋™์ผํ•ด์ง„๋‹ค. ์ฆ‰ (this.title === group.title)์ด ๋œ๋‹ค.

    let group = { 
            title: "1๋ชจ๋‘ ", 
            students: ["๋ณด๋ผ", "ํ˜ธ์ง„", "์ง€๋ฏผ"], 
    
            showList() {
                this.students.forEach(student => alert(this.title ': ' + student));
            }
    };
    
    group.showList();

    [์ผ๋ฐ˜ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์‹œ]
    forEach์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์˜ this๊ฐ€ window๋ฅผ ๊ฐ€๋ฆฌ์ผœ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

    let group = { 
            title: "1๋ชจ๋‘ ", 
            students: ["๋ณด๋ผ", "ํ˜ธ์ง„", "์ง€๋ฏผ"], 
    
            showList(){
                this.students.forEach(function(student)){
                    //TypeError: Cannot read property 'title' of undefined
                    alert(this.title + ': ' + student)
                });
            }
    };
    
    group.showList();

     

    2. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” new์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž๋กœ์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์œผ๋ฉฐ new์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    const Person = (name, age) => {
        this.name = name;
        this.age = age;
    }
    
    const tom = new Person('Tom', 18); // Uncaught TypeError: Person is not a constructor

     

    3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—๋Š” 'arguments'๊ฐ€ ์—†๋‹ค.

    ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์ž์ฒด์˜ arguments ๋ฐ”์ธ๋”ฉ์„ ๊ฐ–์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ arguments๋ฅผ ์ฐธ์กฐํ•˜๋ฉด this์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ arguments๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

    (function(){
        const foo = () => console.log(arguments); //ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ foo์˜ arguments๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜์˜ arguments๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. (1, 2๋ฅผ ๊ฐ€๋ฆฌํ‚ด)
        foo(3,4);
    }(1,2))
    
    const foo = () => console.log(argments);
    foo(1,2); // ReferenceError: arguments is not defined

    arguments ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ€๋ณ€ ์ธ์ž ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ๋Š” arguments ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ arguments ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ž์‹ ์—๊ฒŒ ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์—†๊ณ , ์ƒ์œ„ ํ•จ์ˆ˜์—๊ฒŒ ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ๋ชฉ๋ก์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ๊ทธ๋‹ค์ง€ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๊ฐ€๋ณ€ ์ธ์ž ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋•Œ๋Š” Rest ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

     

    ์ฐธ๊ณ ๋กœ Rest ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋“ค์˜ ๋ชฉ๋ก์„ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ์ผ๋ฐ˜ arguments๋ฅผ ์ด์šฉํ•˜๋ฉด, arguments ์ž์ฒด๊ฐ€ ๋ฐฐ์—ด์ด ์•„๋‹Œ ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Function.prototype.call์ด๋‚˜ Function.prototype.apply๋กœ arguments ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ๋‹ค.

    function foo(...rest){
        console.log(rest); // [1,2,3,4,5]
    }

    rest ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋ณ€์ธ์ž ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    [restํŒŒ๋ผ๋ฏธํ„ฐ + ํ™”์‚ดํ‘œ ํ•จ์ˆ˜]

    function sum(...args) {
        return args.reduce((pre, cur) => pre+,cur, 0);
    }
    console.log(sum(1,2,3,4,5));

    [arguments + ์ผ๋ฐ˜ ํ•จ์ˆ˜]

    function sum() {
        var array = Array.prototype.slice.call(arguments);
    
        return array.reduce((function (pre,cur){
            return pre + cur;
        }, 0);)
    }

    ๋Œ“๊ธ€

Designed by Tistory.