์์ฑ์ : ์ด์ฌ๊ธฐ
- ์ฌํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต๋ถํ๋ฉด์, this๊ฐ ๊ฐ๊ฐํ ๋ฑ์ฅํ๋ ๊ฒ์ ๋ณด์์ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ ์ฐ์ด๋ ๊ฒ ๊ฐ๊ณ , ์ ๊ธฐ์๋ ์ฐ์ด๋ ๊ฒ ๊ฐ์ this.... ? ์ ํํ ์ ์ํด๋ณด์.
- this๋ ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๊ธฐ ์ฐธ์กฐ ๋ณ์๋ค. this๋ฅผ ํตํด ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ์ ์๋ง ์ฝ์ผ๋ฉด ์ ์ฐ์ด๋์ง, ์ด๋ค ๋ ์ฐ์ด๋ ์ง ์๊ธฐ ํ๋๋ ์ฒ์ฒํ ์ดํดํด๋ณด์.
-
๊ฐ์ฒด๋ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ์ ๋์์ ๋ํ๋ด๋ ๋ฉ์๋๋ฅผ ํ๋์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ ๋ณตํฉ์ ์ธ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด๋, ๋์์ ๋ํ๋ด๋ ๋ฉ์๋๋ ์์ ์ด ์ํ ๊ฐ์ฒด์ ์ํ, ์ฆ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํ๋ค. ์ด ๋ ๋ฉ์๋๊ฐ ์์ ์ด ์ํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด
-
๋จผ์ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ด์ผ ํ๋ค.
-
๋ค์ ์์ ์ฝ๋๋ฅผ ๋ณด์.
const home = { //ํ๋กํผํฐ: ๊ฐ์ฒด ๊ณ ์ ์ ์ํ ๋ฐ์ดํฐ mom: "์ฌ๊ธฐ", //๋ฉ์๋: ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์กฐ์ํ๋ ๋์ getSon() { //์ด ๋ฉ์๋๊ฐ ์์ ์ด ์ํ ํ๋กํผํฐ๋ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด //์์ ์ด ์ํ ๊ฐ์ฒด์ธ mom์ ์ฐธ์กฐํ ์ ์์ด์ผ ํ๋ค. return home.mom + "์ ์ฝ๋์ด์ ๋ชจ์นด"; }, }; console.log(home.getSon()); //์ฌ๊ธฐ์ ์ฝ๋์ด์ ๋ชจ์นด
- getSon ๋ฉ์๋ ๋ด์์ ๋ฉ์๋ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์ mom์ ์ฐธ์กฐํ๊ณ ์๋ค. ์ด ์ฐธ์กฐ ํํ์์ด ํ๊ฐ๋๋ ์์ ์ getSon๋ฉ์๋๊ฐ ํธ์ถ๋์ด ํจ์ ๋ชธ์ฒด๊ฐ ์คํ๋๋ ์์ ์ด๋ค.
- ์ ์์ ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ home ๋ณ์์ ํ ๋น๋๊ธฐ ์ง์ ์ ํ๊ฐ๋๋ค. ๋ฐ๋ผ์ mom ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์์ ์๋ ์ด๋ฏธ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํ๊ฐ๊ฐ ์๋ฃ๋์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋์๊ณ home ์๋ณ์์ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น๋ ์ดํ๋ค. ๋ฐ๋ผ์ ๋ฉ์๋ ๋ด๋ถ์์ home ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด: ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฐํจ๊ณผ ๊ฐ๋ ฅํจ์ ๋ํํ๋ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์. ํด๋์ค๋ฅผ ์ ์ํ๊ฑฐ๋ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์์ฝ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ฐ๋จํ ์ดํดํ์๋ฉด const x = {y:1} ์ผ ๋ ์ค๊ดํธ ์์ ๋ปํ๋ค.
- ํ์ง๋ง! ์๊ธฐ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฐธ์กฐํ๋ ๋ฐฉ์์ ์ผ๋ฐ์ ์ด์ง ์๊ณ , ๋ฐ๋์งํ์ง๋ ์๋ค.
-
์ด๋ฒ์๋ ์์ฑ์ ํจ์ ๋ฐฉ์์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
function Home (mom){ //์ด ์์ ์๋ ์์ฑ์ ํจ์ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ ์ ์๋ค. ???.mom = mom; } Home.prototype.homeMember = function (){ //์ด ์์ ์๋ ์์ฑ์ ํจ์ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ ์ ์๋ค. return "๊ท์ฌ์ด ์ฝ๋์ด์ ๋ชจ์นด์ ์ฑ์คํ " + ???.mom; } //์์ฑ์ ํจ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋จผ์ ์์ฑ์ ํจ์๋ฅผ ์ ์ํด์ผ ํ๋ค. const home = new Home("์ฌ๊ธฐ");
- ์์ฑ์ ํจ์ ๋ด๋ถ์์๋ ํ๋กํผํฐ ๋๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค. ํ์ง๋ง ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ๋จผ์ ์์ฑ์ ํจ์๋ฅผ ์ ์ํ ์ดํ new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ ๋จ๊ณ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ค.
- ์ฆ, ์์ฑ์ ํจ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋จผ์ ์์ฑ์ ํจ์๊ฐ ์กด์ฌํด์ผ ํ๋ค.
- ์์ฑ์ ํจ์๋ฅผ ์ ์ํ๋ ์์ ์๋ ์์ง ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ด์ ์ด๋ฏ๋ก ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ ์ ์๋ค.
- ๊ทธ๋ ๊ธฐ์ ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ํน์ํ ์๋ณ์๊ฐ ํ์ํ๋ค. ์ด๋ฅผ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ๋ this๋ผ๋ ํน์ํ ์๋ณ์๋ฅผ ์ ๊ณตํ๋ค.
-
this๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋ฌต์ ์ผ๋ก ์์ฑ๋๋ฉฐ, ์ฝ๋ ์ด๋์๋ ์ฐธ์กฐํ ์ ์๋ค. ํจ์๋ฅผ ํธ์ถํ๋ฉด argument ๊ฐ์ฒด์ this๊ฐ ์๋ฌต์ ์ผ๋ก ํจ์ ๋ด๋ถ์ ์ ๋ฌ๋๋ค. ํจ์ ๋ด๋ถ์์ argument๋ฅผ ์ง์ญ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ฒ๋ผ this๋ ์ง์ญ ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ค.
-
๋จ, this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ, ์ฆ this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์์ ์ํด ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
this ๋ฐ์ธ๋ฉ: ๋ฐ์ธ๋ฉ์ด๋ ์๋ณ์์ ๊ฐ์ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ด๋ค. ์๋ฅผ ๋ค์ด ๋ณ์ ์ ์ธ์ ๋ณ์ ์ด๋ฆ(์๋ณ์)์ ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ ๊ฒ์ด๋ค. this ๋ฐ์ธ๋ฉ์ this์ this๊ฐ ๊ฐ๋ฆฌํฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ ๊ฒ์ด๋ค.
-
์ฒซ๋ฒ ์งธ ์์ ์ this๋ฅผ ์ฌ์ฉํด ์์ ํด ๋ณด์๋ค.
const home = { mom: "์ฌ๊ธฐ", getSon() { //this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. return this.mom + "์ ์ฝ๋์ด์ ๋ชจ์นด"; }, }; console.log(home.getSon()); //์ฌ๊ธฐ์ ์ฝ๋์ด์ ๋ชจ์นด
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ๋ฉ์๋ ๋ด๋ถ์์์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด, home์ ๊ฐ๋ฆฌํจ๋ค.
-
๋ ๋ฒ์งธ ์์ ๋ฅผ this๋ฅผ ์ฌ์ฉํด ์์ ํด ๋ณด์.
function Home(mom) { //this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. this.mom = mom; } Home.prototype.homeMember = function () { //this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. return "๊ท์ฌ์ด ์ฝ๋์ด์ ๋ชจ์นด์ ์ฑ์คํ " + this.mom; }; //์ธ์คํด์ค ์์ฑ const home = new Home("์ฌ๊ธฐ"); console.log(home.homeMember()); // ๊ท์ฌ์ด ์ฝ๋์ด์ ๋ชจ์นด์ ์ฑ์คํ ์ฌ๊ธฐ
- ์์ฑ์ ํจ์ ๋ด๋ถ์ this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ด์ฒ๋ผ this๋ ์ํฉ์ ๋ฐ๋ผ ๊ฐ๋ฆฌํค๋ ๋์์ด ๋ค๋ฅด๋ค.
-
์๋ฐ๋ C++ ๊ฐ์ ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์์ this๋ ์ธ์ ๋ ํด๋์ค๊ฐ ์์ฑํ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์ this๋ ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ this์ ๋ฐ์ธ๋ฉ ๋ ๊ฐ, ์ฆ this ๋ฐ์ธ๋ฉ์ด ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
-
this๋ ์ฝ๋ ์ด๋์์๋ ์ฐธ์กฐ ๊ฐ๋ฅํ๋ค. ์ ์ญ์์๋ ํจ์ ๋ด๋ถ์์๋ ์ฐธ์กฐํ ์ ์๋ค.
//this๋ ์ด๋์๋ ์ฐธ์กฐํ ์ ์๋ค. //์ ์ญ์์ this๋ window๋ฅผ ๊ฐ๋ฆฌํจ๋ค. console.log(this); //window function square(num) { // ์ผ๋ฐ ํจ์ ๋ด๋ถ์์ this๋ ์ ์ญ๊ฐ์ฒด์ธ window๋ฅผ ๊ฐ๋ฆฌํจ๋ค. console.log(this); //window return num * num; } square(2); const member = { name: "ํฌ์ฌ", getName() { //๋ฉ์๋ ๋ด๋ถ์์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. console.log(this); // {name: "ํฌ์ฌ", getName: f} return this.name; }, }; console.log(member.getName()); //ํฌ์ฌ function member2(name) { this.name = "์ฐฌ๋ฏผ"; //์์ฑ์ ํจ์ ๋ด๋ถ์์ this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. console.log(this); // {member2 {name: "์ฐฌ๋ฏผ"}} } const stuckyi = new member2("๋ณ๋ฏผ");
-
ํ์ง๋ง this๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ ์๊ธฐ ์ฐธ์กฐ ๋ณ์์ด๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด์ ๋ฉ์๋ ๋ด๋ถ ๋๋ ์์ฑ์ ํจ์ ๋ด๋ถ์์๋ง ์๋ฏธ๊ฐ ์๋ค. ๋ฐ๋ผ์ strict mode๊ฐ ์ ์ฉ๋ ์ผ๋ฐ ํจ์ ๋ด๋ถ์ this์๋ undefined๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. ์ผ๋ฐ ํจ์ ๋ด๋ถ์์ this๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(function () { "use strict"; function ex() { console.log(this); //undefined } ex(); function Ex() { console.log(this); //Ex } new Ex(); })();
-
- ์์ ์ดํด ๋ดค๋ฏ this๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์. ์ฆ ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
- ์ฐธ๊ณ ๋ก ๋ ์์ปฌ ์ค์ฝํ์ this ๋ฐ์ธ๋ฉ์ ๊ฒฐ์ ์๊ธฐ๊ฐ ๋ค๋ฅด๋ค. ํจ์์ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ธ ๋ ์์ปฌ ์ค์ฝํ๋ ํจ์ ์ ์๊ฐ ํ๊ฐ๋์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ์ง๋ง, this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ์์ ์ ํ๊ฐ๋๋ค.
-
์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ ๋ชจ๋ ํจ์ (์ค์ฒฉ ํจ์, ์ฝ๋ฐฑ ํจ์ ํฌํจ) ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
-
์ ์ญ ํจ์
function hello() { console.log("hello's this: ", this); //window function world() { console.log("world's this: ", this); //window } world(); } hello();
-
์ค์ฒฉ ํจ์
-
๋ฉ์๋ ๋ด์์ ์ ์ํ ์ค์ฒฉ ํจ์๋ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด ์ค์ฒฉ ํจ์ ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
//var ํค์๋๋ก ์ ์ธํ ์ ์ญ๋ณ์ team์ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ค. var team = "stuckyi"; //const ํค์๋๋ก ์ ์ธํ ์ ์ญ๋ณ์ team์ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ์๋๋ค. //const team = "stuckyi"; const cheerUp = { team: "flower", outer() { console.log("outer's this: ", this); //outer's this: {team: 'flower', outer: ฦ} console.log("outer's this.team: ", this.team); //outer's this.team: flower //๋ฉ์๋ ๋ด์์ ์ ์ํ ์ค์ฒฉ ํจ์ function inner() { console.log("inner's this: ", this); //inner's this: Window console.log("inner's this.team: ", this.team); //inner's this.team: stuckyi } //๋ฉ์๋ ๋ด์์ ์ ์ํ ์ค์ฒฉ ํจ์๋ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด ์ค์ฒฉ ํจ์ ๋ด๋ถ์ this์๋ //์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. inner(); }, }; cheerUp.outer();
-
-
์ฝ๋ฐฑ ํจ์
-
์ฝ๋ฐฑ ํจ์๊ฐ ์ผ๋ฐํจ์๋ก ํธ์ถ๋๋ฉด ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
var team = "stuckyi"; const cheerUp = { team: "flower", outer() { console.log("outer's this: ", this); //outer's this: {team: 'flower', outer: ฦ} //์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ ๋๋ค. setTimeout(function () { console.log("inner's this: ", this); //inner's this: Window console.log("inner's this.team: ", this.team); //inner's this.team: stuckyi }, 100); }, }; cheerUp.outer();
-
-
-
๊ณ ๋ก, ์ด๋ค ํจ์๋ผ๋ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด this์ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
-
๊ทธ๋ ๋ค๋ฉด... ๋ฉ์๋ ๋ด๋ถ์ ์ค์ฒฉํจ์๋ ์ฝ๋ฐฑ ํจ์์ this ๋ฐ์ธ๋ฉ์ ๋ฉ์๋์ this ๋ฐ์ธ๋ฉ๊ณผ ์ผ์น์ํค๋ ค๋ฉด?
-
๋ณ์์ ํ ๋นํ๊ธฐ
var team = "stuckyi"; const cheerUp = { team: "flower", outer() { // this ๋ฐ์ธ๋ฉ (cheerUp)์ ๋ณ์ that์ ํ ๋นํ๋ค. const that = this; //์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this๋์ that์ ์ฐธ์กฐํ๋ค. setTimeout(function () { console.log(that.team); //flower }, 100); }, }; cheerUp.outer();
-
Function.prototype.call, Function.prototype.bind ๋ฉ์๋ ์ฌ์ฉ
-
ํ์ดํ ํจ์ ์ฌ์ฉ
var team = "stuckyi"; const cheerUp = { team: "flower", outer() { // ํ์ดํ ํจ์ ๋ด๋ถ์ this๋ ์์ ์ค์ฝํ์ this๋ฅผ ๊ฐ๋ฆฌํจ๋ค. setTimeout(() => console.log(this.team), 100); //flower }, }; cheerUp.outer();
-
-
๋ฉ์๋ ๋ด๋ถ์์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด, ์ฆ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ด๋ฆ ์์ ๋ง์นจํ(.) ์ฐ์ฐ์ ์์ ๊ธฐ์ ํ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ ๋๋ค.
-
์ฃผ์ํ ์ ์ ๋ฉ์๋ ๊ฐ์ฒด ๋ด๋ถ์ this๋ ๋ฉ์๋๋ฅผ ์์ ํ ๊ฐ์ฒด๊ฐ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค๋ ๊ฒ์ด๋ค.
const team = { name: "stuckyi", getName() { //๋ฉ์๋ ๋ด๋ถ์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค. return this.name; }, }; //๋ฉ์๋ getName์ ํธ์ถํ ๊ฐ์ฒด๋ team์ด๋ค. console.log(team.getName()); //stuckyi
-
์ ์์ ์ getName ๋ฉ์๋๋ team ๊ฐ์ฒด์ ๋ฉ์๋๋ก ์ ์๋์๋ค. ๋ฉ์๋๋ ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ๋ ํจ์๋ค. ์ฆ, team๊ฐ์ฒด์ getName ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํจ์ ๊ฐ์ฒด๋ taem ๊ฐ์ฒด์ ํฌํจ๋ ๊ฒ์ด ์๋๋ผ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ ๋ณ๋์ ๊ฐ์ฒด๋ค. getName ํ๋กํผํฐ๊ฐ ํจ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ ๋ฟ์ด๋ค.
-
๋ฐ๋ผ์, getName ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํจ์ ๊ฐ์ฒด, ์ฆ getName ๋ฉ์๋๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ํ ๋นํ๋ ๊ฒ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ๋ ์๋ ์๊ณ , ์ผ๋ฐ ๋ณ์์ ํ ๋นํ์ฌ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ ์๋ ์๋ค.
const anotherTeam = { name: "flower", }; //getName ๋ฉ์๋๋ฅผ anotherTeam ๊ฐ์ฒด์ ๋ฉ์๋๋ก ํ ๋น anotherTeam.getName = team.getName; //getName ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ anotherTeam์ด๋ค. console.log(anotherTeam.getName()); //flower //getName ๋ฉ์๋๋ฅผ ๋ณ์์ ํ ๋น const getName = team.getName; //getName ๋ฉ์๋๋ฅผ ์ผ๋ฐ ํจ์๋ก ํธ์ถ console.log(getName()); //'' //์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ getName ํจ์ ๋ด๋ถ์ this.name์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ window.name๊ณผ ๊ฐ๋ค. //๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ window.name์ ๋ธ๋ผ์ฐ์ ์ฐฝ์ ์ด๋ฆ์ ๋ํ๋ด๋ ๋นํธ์ธ ํ๋กํผํฐ์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ '' ์ด๋ค. //Node.js ํ๊ฒฝ์์ this.name์ undefined์ด๋ค.
-
ํ๋กํ ํ์ ๋ฉ์๋ ๋ด๋ถ์์ ์ฌ์ฉ๋ this๋ ์ผ๋ฐ ๋ฉ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
function Team(name) { this.name = name; } Team.prototype.getName = function () { return this.name; }; const we = new Team("stuckyi"); //getName ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ we๋ค. console.log(we.getName()); // โ stuckyi Team.prototype.name = "flower"; //getName ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ Person.prototype ์ด๋ค. console.log(Team.prototype.getName()); // โก flower
- โ ์ ๊ฒฝ์ฐ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ we๋ค. ๋ฐ๋ผ์, getName์ ๋ฉ์๋ ๋ด๋ถ์ this๋ we๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ this.name์ 'stuckyi'์ด๋ค.
- โก์ ๊ฒฝ์ฐ getName์ ํธ์ถํ ๊ฐ์ฒด๋ Team.prototype์ด๋ค. Team.prototype๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ง์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค. ๋ฐ๋ผ์, getName์ ๋ฉ์๋ ๋ด๋ถ์ this๋ Team.prototype์ ๊ฐ๋ฆฌํค๋ฉฐ this.name์ 'flower'์ด๋ค.
-
-
์์ฑ์ ํจ์ ๋ด๋ถ์ this์๋ ์์ฑ์ ํจ์๊ฐ (๋ฏธ๋์) ์์ฑํ ์ธ์คํด์ค๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
function Team(member) { //์์ฑ์ ํจ์ ๋ด๋ถ์ this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. this.member = member; this.getMember = function () { return "์คํฌํค ๋ฉค๋ฒ์ธ " + this.member; }; } //๋ฉค๋ฒ๊ฐ ํฌ์ฌ์ธ stuckyi1 ๊ฐ์ฒด๋ฅผ ์์ฑ const stuckyi1 = new Team("ํฌ์ฌ"); //๋ฉค๋ฒ๊ฐ ์ฐ์์ธ stuckyi2 ๊ฐ์ฒด๋ฅผ ์์ฑ const stuckyi2 = new Team("์ฐ์"); console.log(stuckyi1.getMember()); //์คํฌํค ๋ฉค๋ฒ์ธ ํฌ์ฌ console.log(stuckyi2.getMember()); //์คํฌํค ๋ฉค๋ฒ์ธ ์ฐ์
- ์์ฑ์ ํจ์๋ ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ฒด (์ธ์คํด์ค)๋ฅผ ์์ฑํ๋ ํจ์๋ค. ์ผ๋ฐ ํจ์์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ์ ํจ์๋ฅผ ์ ์ํ๊ณ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด ํด๋น ํจ์๋ ์์ฑ์ ํจ์๋ก ๋์ํ๋ค.
- ๋ง์ฝ new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ์์ฑ์ ํจ์๊ฐ ์๋๋ผ ์ผ๋ฐ ํจ์๋ก ๋์ํ๋ค.
//new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ง ์์ผ๋ฉด ์์ฑ์ ํจ์๋ก ๋์ํ์ง ์๋๋ค. ์ฆ, ์ผ๋ฐ์ ์ธ ํจ์์ ํธ์ถ์ด๋ค. const stuckyi3 = Team("์ฌ๊ธฐ"); //์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ Team์๋ ๋ฐํ๋ฌธ์ด ์์ผ๋ฏ๋ก ์๋ฌต์ ์ผ๋ก undefined๋ฅผ ๋ฐํํ๋ค. console.log(stuckyi3); //undefined //์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ Team์ ๋ด๋ถ์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. console.log(member); //์ฌ๊ธฐ
-
apply, call, bind๋ Function.prototype์ ๋ฉ์๋๋ค. ์ฆ, ์ด๋ค ๋ฉ์๋๋ ๋ชจ๋ ํจ์๊ฐ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
2.1.1. Function.prototype.apply, Function.prototype.call
-
apply์ call์ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ํธ์ถํ๋ค.
function getThisBinding() { return this; } //this๋ก ์ฌ์ฉํ ๊ฐ์ฒด const thisArg = { a: 1 }; console.log(getThisBinding()); //window //getThisBinding ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ์ธ์๋ก ์ ๋ฌํ ๊ฐ์ฒด๋ฅผ getThisBinding ํจ์์ this์ ๋ฐ์ธ๋ฉํ๋ค. console.log(getThisBinding.apply(thisArg)); //{ a: 1 } console.log(getThisBinding.call(thisArg)); //{ a: 1 }
-
apply์ call ๋ฉ์๋๋ ํธ์ถํ ํจ์์ ์ธ์๋ฅผ ์ ๋ณํ๋ ๋ฐฉ์๋ง ๋ค๋ฅผ ๋ฟ ๋์ผํ๊ฒ ๋์ํ๋ค.
function getThisBinding() { console.log(arguments); return this; } //this๋ก ์ฌ์ฉํ ๊ฐ์ฒด const thisArg = { a: 1 }; //getThisBinding ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ์ธ์๋ก ์ ๋ฌํ ๊ฐ์ฒด๋ฅผ getThisBinding ํจ์์ this์ ๋ฐ์ธ๋ฉํ๋ค. //apply ๋ฉ์๋๋ ํธ์ถํ ํจ์์ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฌถ์ด ์ ๋ฌํ๋ค. console.log(getThisBinding.apply(thisArg, [1, 2, 3])); //[Arguments] { '0': 1, '1': 2, '2': 3 } //{ a: 1 } //call ๋ฉ์๋๋ ํธ์ถํ ํจ์์ ์ธ์๋ฅผ ์ผํ๋ก ๊ตฌ๋ถํ ๋ฆฌ์คํธ ํ์์ผ๋ก ์ ๋ฌํ๋ค. console.log(getThisBinding.call(thisArg, 1, 2, 3)); ////[Arguments] { '0': 1, '1': 2, '2': 3 } //{ a: 1 }
-
apply์ call ๋ฉ์๋์ ๋ํ์ ์ธ ์ฉ๋๋ arguments ๊ฐ์ฒด์ ๊ฐ์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ด๋ค. arguments ๊ฐ์ฒด๋ ๋ฐฐ์ด์ด ์๋๊ธฐ ๋๋ฌธ์ Array.prototype.slice ๊ฐ์ ๋ฐฐ์ด์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋, apply์ call ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค.
function convertArgsToArray() { console.log(arguments); //arguments ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ณํ //Array.prototype.slice๋ฅผ ์ธ์ ์์ด ํธ์ถํ๋ฉด ๋ฐฐ์ด์ ๋ณต์ฌ๋ณธ์ ์์ฑํ๋ค. const arr = Array.prototype.slice.call(arguments); // const arr = Array.prototype.slice.apply(arguments); console.log(arr); return arr; } convertArgsToArray(1, 2, 3); //[ 1, 2, 3 ] ``` <b>2.1.1. Function.prototype.bind</b>
-
bind ๋ฉ์๋๋ apply์ call ๋ฉ์๋์ ๋ฌ๋ฆฌ ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ง ์ ๋ฌํ๋ค.
function getThisBinding() { return this; } //this๋ก ์ฌ์ฉํ ๊ฐ์ฒด const thisArg = { a: 1 }; //bind ๋ฉ์๋๋ ํจ์์ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค. //bind ๋ฉ์๋๋ ํจ์๋ฅผ ํธ์ถํ์ง ์๋๋ค. console.log(getThisBinding.bind(thisArg)); //getThisBinding //bind ๋ฉ์๋๋ ํจ์๋ฅผ ํธ์ถํ์ง ์์ผ๋ฏ๋ก ๋ช ์์ ์ผ๋ก ํธ์ถํด์ผ ํ๋ค. console.log(getThisBinding.bind(thisArg)()); //{ a: 1 }
-
bind ๋ฉ์๋๋ ๋ฉ์๋์ this์ ๋ฉ์๋ ๋ด๋ถ์ ์ค์ฒฉ ํจ์ ๋๋ ์ฝ๋ฐฑ ํจ์์ this๊ฐ ๋ถ์ผ์นํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค. ์๋ก ๋ค์ด, ์๋์ ์์ ๋ฅผ ๋ณด์.
const Team = { name: "์ฐฌ๋ฏผ", babo(callback) { setTimeout(callback, 10000); }, }; Team.babo(function () { console.log(`์๋ ~ ${this.name}`); //์๋ ~ undefined //์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this.name์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ window.name๊ณผ ๊ฐ๋ค. // ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ window.name์ ๋ธ๋ผ์ฐ์ ์ฐฝ์ ์ด๋ฆ์ ๋ํ๋ด๋ ๋นํธ์ธ ํ๋กํผํฐ์ด๋ฉฐ ๊ฐ์ ''์ด๋ค. //Node.js ํ๊ฒฝ์์ this.name์ undefined ์ด๋ค. });
-
Team.babo์ ์ฝ๋ฐฑํจ์๋ ์ธ๋ถ ํจ์ Team.babo๋ฅผ ๋๋ ํฌํผ ํจ์(๋ณด์กฐ ํจ์) ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ํจ์ Team.babo ๋ด๋ถ์ this์ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this๊ฐ ์์ดํ๋ฉด ๋ฌธ๋งฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
-
๋ฐ๋ผ์, ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this๋ฅผ ์ธ๋ถ ํจ์ ๋ด๋ถ์ this์ ์ผ์น ์์ผ์ผ ํ๋ค. ์ด ๋, bind ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ this๋ฅผ ์ผ์น์ํฌ ์ ์๋ค.
const Team = { name: "์ฐฌ๋ฏผ", babo(callback) { setTimeout(callback.bind(this), 10000); }, }; Team.babo(function () { console.log(`์๋ ~ ${this.name}`); //์๋ ~ ์ฐฌ๋ฏผ });
-
-
ํจ์ ํธ์ถ ๋ฐฉ์ | this ๋ฐ์ธ๋ฉ |
---|---|
์ผ๋ฐ ํจ์ ํธ์ถ | ์ ์ญ ๊ฐ์ฒด |
๋ฉ์๋ ํธ์ถ | ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด |
์์ฑ์ ํจ์ ํธ์ถ | ์์ฑ์ ํจ์๊ฐ (๋ฏธ๋์) ์์ฑํ ์ธ์คํด์ค |
apply,call,bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ | apply,call,bind ๋ฉ์๋์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๊ฐ์ฒด |
์ถ์ฒ : ๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ deep dive