ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JavaScript/ES6] Arrow(ํ™”์‚ดํ‘œ) ํ•จ์ˆ˜ - thisํŽธ
    javascript 2019. 5. 21. 00:13

    ์•ˆ๋…•ํ•˜์„ธ์š”, JERRY์ž…๋‹ˆ๋‹ค.

     

    ๊ตฌ๋ฌธ ํŽธ์„ ํฌ์ŠคํŒ… ํ•œ ์ดํ›„ ์—ด ํ˜์ด ์ง€๋‚ฌ๋„ค์š”. Arrow ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ์—” ์‹œ๋ฆฌ์ฆˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋‘˜๋Ÿฌ์„œ ํฌ์ŠคํŒ…ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์–ด๋–ค ์ด์œ ๊ฐ€ ์žˆ์–ด๋„ ์ „๋ถ€ ํ•‘๊ณ„๊ฒ ์ง€์š”.

     

    ์ด์ „ ํฌ์ŠคํŒ…(https://bejerry.tistory.com/25)์˜ ๋งˆ์ง€๋ง‰์—์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ this, arguments, super ๋˜๋Š” new.target์„ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์—„์ฒญ ์ƒ์„ธํžˆ ํฌ์ŠคํŒ…ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋Š”๋ฐ zerocho๋‹˜๊ป˜์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์•Œ๋ฉด this ๊ฐ™์€ ๊ฒƒ๋“ค์€ ์ดํ•ด๊ฐ€ ๋œ๋‹ค๊ณ  ํ•˜์…”์„œ ์ถ”ํ›„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…์„ ํ•ด์„œ ๊ทธ๋•Œ this๋ฅผ ์ƒ์„ธํžˆ ๋‹ค๋ฃจ๊ธฐ๋กœ ํ•˜๊ณ  ํ˜„์žฌ ํฌ์ŠคํŒ… ์ค‘์ธ arrow ํ•จ์ˆ˜์—์„œ๋Š” this๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ”์ธ๋”ฉ์ด ๋˜์ง€ ์•Š๋Š”์ง€ ๊ฐ„๋žตํžˆ ์†Œ๊ฐœ๋งŒ ๋“œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

     

    ์ž, ๊ทธ๋Ÿผ this ํŽธ์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”?

    ์˜ˆ์ œ๋Š” mdn์—์„œ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

     

    ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๋Š” this
    
    function Person() {
      // ์—ฌ๊ธฐ์„œ์˜ 'this'๋Š” Person์˜ ์ธ์Šคํ„ด์Šค๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
      this.age = 0;
      console.log(this); // ๊ฒฐ๊ณผ : Person()
      
      setInterval(function growUp() {
        // growUp() ํ•จ์ˆ˜๋Š” 'this'๋ฅผ ์ „์—ญ ๊ฐ์ฒด๋กœ ์ •์˜ํ•˜๊ณ ,
        // ์ด 'this'๋Š” Person() ์ƒ์„ฑ์ž์˜ 'this'์™€ ๋‹ค๋ฆ„.
        this.age++;
        console.log(this === window); // 1์ดˆ๋งˆ๋‹ค true๊ฐ€ ๋‚˜์˜ด.
      }, 1000);
    }
    
    var p = new Person();
    

     

    ์ด ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์•„๋ž˜์˜ ์‚ฌ์ง„์œผ๋กœ ๊ฐ™์ด ํ™•์ธํ•ด๋ณด์‹ค๊นŒ์š”?

     

    Person( ) ์ƒ์„ฑ์ž์˜ this๋Š” Person์ด๋ผ๊ณ  log์— ๋‚˜์˜ค๊ณ , growUp( ) ํ•จ์ˆ˜์˜ this๋Š” window์™€ ๊ฐ™๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  age์˜ ๊ฐ’์€ ๊ณ„์† '0'์ด๋‹ค.

     

    Person( ) ์ƒ์„ฑ์ž์˜ 'this'์™€ growUp( ) ํ•จ์ˆ˜์˜ 'this'๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Person( ) ์ƒ์„ฑ์ž์˜ this๊ฐ€ growUp( ) ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”? arrow ํ•จ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ, ๊ทธ์ „์— ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. (mdn์—์„œ๋„ ์นœ์ ˆํ•˜๊ฒŒ ์†Œ๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.)

     

    ์œ„์— ์ž‘์„ฑ๋œ ์†Œ์Šค์™€ ๋ฐ”๋กœ ์•„๋ž˜์˜ ์†Œ์Šค๋ฅผ ๋น„๊ตํ•ด๋ณด์„ธ์š”. this๋ฅผ that ๋ณ€์ˆ˜์— ๋‹ด๊ณ  that์„ growUp( ) ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

    
    function Person() {
      // (๋น„์ „์—ญ) ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ํ•ด๊ฒฐ
      var that = this;
      that.age = 0;
      
      setInterval(function growUp() {
        that.age++;
      }, 1000);
    }
    
    var p = new Person();
    

     

     

    ์ด ์†Œ์Šค์˜ ๊ฒฐ๊ณผ๋„ ํ•œ ๋ฒˆ ์•„๋ž˜์˜ ์บก์ฒ˜๋กœ ํ™•์ธํ•ด๋ณด์‹ค๊นŒ์š”?

     

    console.log( )๋กœ that๊ณผ this๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋‘˜ ๋‹ค ๊ฐ™์€ Person ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  age์˜ ๊ฐ’์€ 1์ดˆ๋งˆ๋‹ค ์ฆ๊ฐ์—ฐ์‚ฐ์ž(++)๋กœ ์ธํ•˜์—ฌ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

     

    ์ด์ œ ์ƒ๊ฐํ–ˆ๋˜ ๋Œ€๋กœ 1์ดˆ๋งˆ๋‹ค age์˜ ๊ฐ’์€ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž(++)๋กœ ์ธํ•ด 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. arrow ํ•จ์ˆ˜์˜ 'this'๋Š” ์ƒˆ๋กœ ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ผ๊นŒ? ์ œ์ผ ์œ„์— ์ž‘์„ฑํ–ˆ๋˜ ์†Œ์Šค๋ฅผ ์ž ๊น ๋ณด๊ณ  ์˜ค์ฃ . growUp( ) ํ•จ์ˆ˜์—์„œ์˜ this๋Š” Person( ) ์ƒ์„ฑ์ž์˜ this์™€๋Š” ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. 'arrow ํ•จ์ˆ˜์—์„œ this๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค'๋ผ๋Š” ๋ง์€ ์ฝ”๋“œ์—์„œ ๋ฐ”๋กœ ๋ฐ”๊นฅ์˜ ํ•จ์ˆ˜(ํ˜น์€ class)์˜ this๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

     

    ํ•จ๊ป˜ ์ฝ”๋“œ๋ฅผ ๋ณด์‹ค๊นŒ์š”?

     

    
    function Person() {
      this.age = 0;
      
      setInterval(() => {
        // this๊ฐ€ Person ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
        this.age++;
      }, 1000);
    }
    
    var p = new Person();
    

     

    ์ฝ”๋“œ์˜ ์–‘์ด ์ค„์–ด์„œ ์ข‹๊ธด ํ•˜์ง€๋งŒ this๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ์ž˜ ๊ณ ๋ คํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์†Œ์Šค์˜ ๊ฒฐ๊ณผ๋ฅผ ์•„๋ž˜์˜ ์‚ฌ์ง„์œผ๋กœ ๊ฐ™์ด ๋ณด์‹ค๊นŒ์š”?

     

    arrow ํ•จ์ˆ˜ ์•ˆ์— this๋Š” Person์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.

     

     

    ์ด๋ ‡๊ฒŒ ๊ธฐ์กด function ํ‘œํ˜„์‹์—์„œ์˜ this์™€ arrow(ํ™”์‚ดํ‘œ) ํ•จ์ˆ˜์—์„œ์˜ this๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด์ง„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

     

    ์ง€๊ธˆ๊นŒ์ง€ ES6 ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ECMAScript 6 ๋ผ๋Š” ๋„์„œ์˜ ๋ชฉ์ฐจ ์ˆœ์„œ๋Œ€๋กœ ํฌ์ŠคํŒ…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ๊ทธ๋ ‡๊ฒŒ ๊ณ„ํš์„ ํ–ˆ์—ˆ๋Š”๋ฐ ๊ณต๋ถ€ํ•˜๋Š” ์†๋„์™€ ํฌ์ŠคํŒ… ์†๋„๊ฐ€ ๋งž์ง€ ์•Š๊ณ  React ๊ณต๋ถ€์— ์ง€์žฅ์ด ์žˆ์–ด์„œ, Arrow(ํ™”์‚ดํ‘œ) ํ•จ์ˆ˜ ์‹œ๋ฆฌ์ฆˆ(?)๊นŒ์ง€๋งŒ ๋„์„œ์˜ ๋ชฉ์ฐจ๋Œ€๋กœ ํฌ์ŠคํŒ…์„ ํ•˜๊ณ  ์ดํ›„๋กœ๋Š” React๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ž์ฃผ ์“ฐ์ด๋Š” ES6 ๋ฌธ๋ฒ•๋งŒ ์ถ”๋ ค์„œ ES6 ์นดํ…Œ๊ณ ๋ฆฌ์— ํฌ์ŠคํŒ…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    'ํ•„์š”ํ•˜๋‹ค', '์ž์ฃผ ์“ฐ์ธ๋‹ค'์˜ ๊ธฐ์ค€์€ ๊ฐœ์ธ์ ์ธ ๊ฒฌํ•ด๊ฐ€ ๋‹ด๊ธฐ๊ฒ ์ง€๋งŒ ํ˜„์—…์ž๋“ค์ด ๋งํ•œ 'ํ•„์š”ํ•˜๋‹ค', '์ž์ฃผ ์“ฐ์ธ๋‹ค'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์œผ๋ ค ๋…ธ๋ ฅํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ํ˜„์—…์ž๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ํ˜„์žฌ ๋ณธ์—…์œผ๋กœ ๊ฐœ๋ฐœ๋„ ํ•˜๋ฉด์„œ ๊ฐ•์˜๋„ ํ•˜๊ณ  ๊ณ„์‹œ๋Š” ๋ถ„๋“ค๋„ ์žˆ๊ณ , ์ œ ์ฃผ์œ„ ์‚ฌ๋žŒ๋“ค๋„ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์ผํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•œ๋‹ค๋Š” ๊ฑด ์ฒด๋ ฅ๋„ ์ฒด๋ ฅ์ด์ง€๋งŒ ๋งˆ์ธ๋“œ๊ฐ€ ํ•ญ์ƒ ์ผ์ •ํ•˜์ง€ ์•Š์œผ๋‹ˆ ์–ธ์ œ๋Š” ๋ถˆ ๋ถ™์–ด์„œํ•˜๊ณ  ์–ธ์ œ๋Š” ํœด์‹์ด ํ•„์š”ํ•ด์„œ ์•ˆํ•˜๋„ค์š”. ๋งค์ผ๊ฐ™์ด ๋ฐ˜์„ฑํ•ฉ๋‹ˆ๋‹ค.

     

    ๊ทธ๋Ÿผ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋งŒ๋‚˜์š” :)

     

     

    ๋Œ“๊ธ€

Posted by Bejerry.