-
[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'์ 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();
์ด ์์ค์ ๊ฒฐ๊ณผ๋ ํ ๋ฒ ์๋์ ์บก์ฒ๋ก ํ์ธํด๋ณด์ค๊น์?
์ด์ ์๊ฐํ๋ ๋๋ก 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๊ฐ ์ฐธ์กฐํ๋ ๊ฒ์ ์ ๊ณ ๋ คํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์์ ์์ค์ ๊ฒฐ๊ณผ๋ฅผ ์๋์ ์ฌ์ง์ผ๋ก ๊ฐ์ด ๋ณด์ค๊น์?
์ด๋ ๊ฒ ๊ธฐ์กด function ํํ์์์์ this์ arrow(ํ์ดํ) ํจ์์์์ this๊ฐ ์ด๋ป๊ฒ ๋ค๋ฅด์ง์ ๋ํด ์์๋ณด์์ต๋๋ค.
์ง๊ธ๊น์ง ES6 ์นดํ ๊ณ ๋ฆฌ๋ ECMAScript 6 ๋ผ๋ ๋์์ ๋ชฉ์ฐจ ์์๋๋ก ํฌ์คํ ์ ํ์ต๋๋ค. ์๋ ๊ทธ๋ ๊ฒ ๊ณํ์ ํ์๋๋ฐ ๊ณต๋ถํ๋ ์๋์ ํฌ์คํ ์๋๊ฐ ๋ง์ง ์๊ณ React ๊ณต๋ถ์ ์ง์ฅ์ด ์์ด์, Arrow(ํ์ดํ) ํจ์ ์๋ฆฌ์ฆ(?)๊น์ง๋ง ๋์์ ๋ชฉ์ฐจ๋๋ก ํฌ์คํ ์ ํ๊ณ ์ดํ๋ก๋ React๋ฅผ ๊ณต๋ถํ๋ฉฐ ํ์ํ๊ฑฐ๋ ์์ฃผ ์ฐ์ด๋ ES6 ๋ฌธ๋ฒ๋ง ์ถ๋ ค์ ES6 ์นดํ ๊ณ ๋ฆฌ์ ํฌ์คํ ํ๊ฒ ์ต๋๋ค.
'ํ์ํ๋ค', '์์ฃผ ์ฐ์ธ๋ค'์ ๊ธฐ์ค์ ๊ฐ์ธ์ ์ธ ๊ฒฌํด๊ฐ ๋ด๊ธฐ๊ฒ ์ง๋ง ํ์ ์๋ค์ด ๋งํ 'ํ์ํ๋ค', '์์ฃผ ์ฐ์ธ๋ค'๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ผ๋ ค ๋ ธ๋ ฅํ ๊ฒ ์ ๋๋ค. ํ์ ์๋ผ๊ณ ํ๋ค๋ฉด ํ์ฌ ๋ณธ์ ์ผ๋ก ๊ฐ๋ฐ๋ ํ๋ฉด์ ๊ฐ์๋ ํ๊ณ ๊ณ์๋ ๋ถ๋ค๋ ์๊ณ , ์ ์ฃผ์ ์ฌ๋๋ค๋ ์๊ฒ ์ต๋๋ค. ํ์คํ ์ผํ๋ฉด์ ๊ณต๋ถํ๋ค๋ ๊ฑด ์ฒด๋ ฅ๋ ์ฒด๋ ฅ์ด์ง๋ง ๋ง์ธ๋๊ฐ ํญ์ ์ผ์ ํ์ง ์์ผ๋ ์ธ์ ๋ ๋ถ ๋ถ์ด์ํ๊ณ ์ธ์ ๋ ํด์์ด ํ์ํด์ ์ํ๋ค์. ๋งค์ผ๊ฐ์ด ๋ฐ์ฑํฉ๋๋ค.
๊ทธ๋ผ ๋ค์ ํฌ์คํ ์์ ๋ง๋์ :)
'javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
vanilla js : ์๋ ์น ์ฑ ๋ง๋ค๊ธฐ ์์ ๊ฐ์ (0) 2019.09.30 [JavaScript/ES6] Arrow(ํ์ดํ) ํจ์ - ์ฃผ์ํ ์ (0) 2019.05.28 [JavaScript/ES6] Arrow(ํ์ดํ) ํจ์ - ๊ตฌ๋ฌธํธ (0) 2019.05.10 [JavaScript/ES6] const ํค์๋ (0) 2019.05.07 [Javascript/ES6] for ( ) ๋ฌธ & NodeList (0) 2019.05.05