์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ •์„ ๐ŸŸก

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] this ์ •๋ฆฌ

์ฝ”๋”ฉํ•˜๋Š” ํฌ๋ฃจ 2023. 9. 16. 16:32

์ฐธ๊ณ ์ž๋ฃŒ: ์ธํ”„๋Ÿฐ ์ฝ”์–ด์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(ํด๋ž˜์Šค ํŽธ)

์ฐธ๊ณ ์ž๋ฃŒ 2

์ฐธ๊ณ ์ž๋ฃŒ3

 

 

โญ๏ธ this

- ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜

- this๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐ

- ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ

- ์ฝ”๋“œ ์–ด๋””์—์„œ๋“  ์ฐธ์กฐ ๊ฐ€๋Šฅ

- ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ๋˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ

- ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ธ์ž์™€ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ

- ์ธ์ž๋ฅผ ์ง€์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, this๋„ ์ง€์—ญ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

- this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’, ์ฆ‰, this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •

- ํฌ๊ฒŒ ์ „์—ญ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ์™€ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋กœ ๋‚˜๋ˆ”

 

 

โœจ ์ฐธ๊ณ ๋กœ, ๋ฐ”์ธ๋”ฉ์ด๋ž€ โ“

- ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •

- ๋ณ€์ˆ˜ ์„ ์–ธ์€ ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ํ™•๋ณด๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ”์ธ๋”ฉ

- this ๋ฐ”์ธ๋”ฉ์€ this์™€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ

 

 

 

 

 

 

 

this๋Š” ์ €๋ฒˆ ๊ฐ•์˜์— ์ด์–ด ์ด๋ถ€๋ถ„์— ํ•ด๋‹น !

 


 

 

โœ…  CASE 1 :  ์ „์—ญ๊ณต๊ฐ„์—์„œ ํ˜ธ์ถœ

๐Ÿ“š ์ „์—ญ๊ณต๊ฐ„์—์„œ ํ˜ธ์ถœ์‹œ : window(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„) / global (Node.js)

- ๋ธŒ๋ผ์šฐ์ €๋ผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ๊ฒฝ์šฐ this๋Š” ํ•ญ์ƒ windows๋ผ๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ

- ์ „์—ญ ๊ฐ์ฒด๋ž€ โ“ ์ „์—ญ ๋ฒ”์œ„์— ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด ( node.js์—์„œ ์ „์—ญ๊ฐ์ฒด๋Š” global)

 

a= 'a';
//"a"

this.a
//"a"

window.a
//"a"

 

// in browser console
this === window // true

// in Terminal
node
this === global // true

 

 

๐Ÿ’ป ์ฝ”๋“œ )

function myFn(){
return this;
}

๐Ÿ“Œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ๊ฐ„์˜ ์ฃผ์ฒด๊ฐ€ ์ „์—ญ๊ณต๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜ ์•ˆ์—์„œ๋„ ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

 

 

 

 

 


 

 

 

 

โœ… CASE 2. ํ•จ์ˆ˜ ๋‚ด๋ถ€

๐Ÿ“š this๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ : window/global ๊ฐ์ฒด ์ถœ๋ ฅ

- ํ•จ์ˆ˜๋Š” ์ „์—ญ์— ์„ ์–ธ๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๊ฐ์ฒด ์•ˆ์— ๋ฉ”์†Œ๋“œ๋กœ ํฌ๊ฒŒ ๊ตฌ๋ถ„

- ๊ฐ์ฒด ์•ˆ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜๋ฅผ ์ „์—ญ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ•จ

- ๊ทธ๋Ÿฐ๋ฐ ์ „์—ญ์— ์„ ์–ธ๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋„ ๊ฒฐ๊ตญ window ์ „์—ญ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ. ์ฆ‰, ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์— ์žˆ์Œ

- ์ด๋•Œ this๋Š” ํ˜„์žฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ

- ์ •๋ฆฌํ•˜๋ฉด, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this์˜ ๊ฐ’์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์˜ํ•ด ๋ฐ”๋€œ

- ์—„๊ฒฉ๋ชจ๋“œ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ฐธ์กฐ ๊ฐ’์ด ๋‹ฌ๋ผ์ง

- ์—„๊ฒฉ๋ชจ๋“œ์—์„œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” undefined๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋จ

 

 

 

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 1 )

var d = {
  e : function() {
    function f() {
      console.log(this);
    }
    f(); // ์ „์—ญ๊ฐ์ฒด
  }
}

๐Ÿ“Œ f ๋ฉ”์†Œ๋“œ ์•ˆ์— this๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ, ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜ด.

๐Ÿ“Œ ์ด์œ ๋Š” ๋’ค์—์„œ ๋งํ•˜๊ฒ ์ง€๋งŒ, f ๋ฉ”์†Œ๋“œ ์•ž์— ์•„๋ฌด๋Ÿฐ ์ง€์ •๊ฐ’์ด ์—†์–ด์„œ ๋ฐ”๋กœ ์ „์—ญ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ

 

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 2)

function a() {
  function b() {
    console.log(this);
  }
  c(); // ์ „์—ญ๊ฐ์ฒด ํ˜ธ์ถœ
}
b(); // ์ „์—ญ๊ฐ์ฒด ํ˜ธ์ถœ

๐Ÿ“Œ ์•”๊ธฐํ•  ์ˆ˜๋ฐ–์— ์—†๋Š” ๋ถ€๋ถ„.. c ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, cํ•จ์ˆ˜์˜ ์ฃผ์ฒด๋Š” b ํ•จ์ˆ˜์ด์ง€๋งŒ ์ „์—ญ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค(this์˜ ๊ฐ’์„ ๋”ฐ๋กœ ์ •ํ•ด๋†“์ง€ ์•Š์Œ)

๐Ÿ“Œ b ํ•จ์ˆ˜๋„ ๋ฉ”์„œ๋“œ ์•ž์— this๋ฅผ ์ฐธ์กฐํ•  ํ•จ์ˆ˜๊ฐ€ ์—†์–ด ์ „์—ญ๊ฐ์ฒด๋กœ ํ˜ธ์ถœ

 

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 3 )

var value = 1;

var obj = {
  value: 100,
  foo: function() {
    console.log("foo's this: ",  this);  // obj
    console.log("foo's this.value: ",  this.value); // 100
    function bar() {
      console.log("bar's this: ",  this); // window
      console.log("bar's this.value: ", this.value); // 1
    }
    bar();
  }
};

obj.foo();

๐Ÿ“Œ foo ๋ฉ”์†Œ๋“œ ํ•จ์ˆ˜์—์„œ๋Š” ๋ฐ”๋กœ ์•ž ์ฃผ์ฒด๊ฐ€ obj๋ผ๋Š” ํ•จ์ˆ˜. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— foo์˜ this๋Š” obj์ด๊ณ , this.value์˜ ๊ฐ’์€ obj์˜ value๊ฐ’์ด 100์ด ์ถœ๋ ฅ

๐Ÿ“Œ bar ๋ฉ”์†Œ๋“œ ํ•จ์ˆ˜๋Š” ์ด์ค‘ํ•จ์ˆ˜๋กœ์จ bar ํ•จ์ˆ˜ ์•ž ์ฃผ์ฒด๊ฐ€ fooํ•จ์ˆ˜. ํ•˜์ง€๋งŒ, foo ํ•จ์ˆ˜์—์„œ ๋ช…ํ™•ํžˆ ์–ด๋–ค ์ฃผ์ฒดํ•  ๋งŒํ•œ ๊ฐ’์ด ์—†์–ด์„œ this์˜ ๊ฐ’๋„ ์ •ํ•ด๋†“์€ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ. this๋Š” window๋ผ๋Š” ์ „์—ญ๊ฐ์ฒด, this.value๋Š” ์ „์—ญ๋ณ€์ˆ˜์ธ 1์ด ์ถœ๋ ฅ

โœ… ๋’ค์—์„œ ์ „์—ญ๊ฐ์ฒด์™€ ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ฒŒ 

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 4 )

var value = 1;

var obj = {
  value: 100,
  foo: function() {
    setTimeout(function() {
      console.log("callback's this: ",  this);  // window
      console.log("callback's this.value: ",  this.value); // 1
    }, 100);
  }
};

obj.foo();

๐Ÿ“Œ this๊ฐ€ ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€์•ผ ๋˜์ง€๋งŒ, ์ „์—ญ๋ณ€์ˆ˜ a๋ฅผ ํ˜ธ์ถœ.

๐Ÿ“Œ ์ „์—ญ๊ฐ์ฒด๋Š” ์ „์—ญ๊ฐ์ฒด๊ณ , ์ „์—ญ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋งž์ง€๋งŒ ๋ณ„๊ฐœ์˜ ๊ฐœ๋…์œผ๋กœ ๋„ˆ๋ฌด ์ƒ๊ฐํ•˜์ง€ ๋ง์ž!

 

 

 

๐Ÿ“š ์˜ˆ์™ธ์ ์œผ๋กœ )  that์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ((์ฐธ๊ณ ๋งŒ))

var value = 1;

var obj = {
  value: 100,
  foo: function() {
    var that = this;  // Workaround : this === obj

    console.log("foo's this: ",  this);  // obj
    console.log("foo's this.value: ",  this.value); // 100
    function bar() {
      console.log("bar's this: ",  this); // window
      console.log("bar's this.value: ", this.value); // 1

      console.log("bar's that: ",  that); // obj
      console.log("bar's that.value: ", that.value); // 100
    }
    bar();
  }
};

obj.foo();

 

 

 

 


 

โœ… CASE 3. ๋ฉ”์„œ๋“œ

 

๐Ÿ“š ์ฐธ๊ณ , ๋ฉ”์„œ๋“œ์—์„œ this์˜ ์˜์—ญ

 

 

๐Ÿ“š ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ํ•จ์ˆ˜์—์„œ this

 

๐Ÿ’ป ์ฝ”๋“œ 1)

const fn = {
  title: 'Hello World',
  showTitle(){
    console.log(this.title);
  }
};

fn.showTitle();
//Hello World

๐Ÿ“Œ showTitle ๋ฉ”์„œ๋“œ ์•ž์— fn์ด this๋กœ ์ •ํ•ด์ ธ showTitle() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, ์ฝ˜์†”์— this๊ฐ€ fn์œผ๋กœ ๊ฒฐ์ •๋˜๊ณ  fn์˜ title๋ฅผ ์ฝ˜์†”์— ์ฐํ˜€์„œ "Hello World"๊ฐ€ ์ถœ๋ ฅ

 

 

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 2)

var a = {
  b : function(){
    console.log(this);
  }
}

a.b(); //a๊ฐ€ this

๐Ÿ“Œ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์  ์•ž์— ์žˆ๋Š” a๊ฐ€ this๊ฐ€ ๋˜๋Š” ๊ฒƒ

๐Ÿ“Œ b ํ•จ์ˆ˜๋ฅผ a ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ

โœ… ๋ฉ”์„œ๋“œ๋ผ๋Š” ๊ฒƒ์ด ์›๋ž˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ, ์–ด๋–ค ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ๋•Œ๋Š” ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 3)

var a = {
  b : {
    c:  function(){
    console.log(this);
    }
  }
}

a.b.c(); //a.b๊ฐ€ this

๐Ÿ“Œ ์—ฌ๊ธฐ์„œ๋Š” a.b๊นŒ์ง€๊ฐ€ this๋ฅผ ๊ฐ€๋ฆฌํ‚ด

 

 

 

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 3-1) 

const fn = {
  title: "hello world",
  tags : [1,2,3,4],
  showTag(){
    this.tags.forEach(function(tag){
      console.log(tag);
      console.log(this); //window
    })
  }
}

fn.showTag();

// 1
// window ๊ฐ์ฒด ์ถœ๋ ฅ
// 2
// window ๊ฐ์ฒด ์ถœ๋ ฅ
// 3
// window ๊ฐ์ฒด ์ถœ๋ ฅ
// 4
// window ๊ฐ์ฒด ์ถœ๋ ฅ

๐Ÿ“Œ  ๊ณ ์ฐจ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์•ˆ์—์„œ this๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ

๐Ÿ“Œ showTag ํ•จ์ˆ˜ ์•ˆ์— tag ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•จ. ์—ฌ๊ธฐ์„œ fn.showTag()์—์„œ this๊ฐ€ fn์ด๋ผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณ ์ฐจ ํ•จ์ˆ˜์—์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ๊ทธ์ € ์ผ๋ฐ˜ํ•จ์ˆ˜์ผ ๋ฟ.

 

 

 

๐Ÿ’ป  ์ฝ”๋“œ 3-2)  ํ•จ์ˆ˜์— ๋‘๋ฒˆ์งธ ์ธ์ž ๋„ฃ์–ด์„œ this ์ธ์ž ๊ฐ์ฒด ๋„˜๊ฒจ์ฃผ๊ธฐ

const fn = {
  title: "hello world",
  tags : [1,2,3,4],
  showTag(){
    this.tags.forEach(function(tag){
      console.log(tag);
      console.log(this); //fn
    }, this); //์—ฌ๊ธฐ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ฐ”๊นฅ, fn ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Œ
  }
}

fn.showTag();

// 1
// fn ๊ฐ์ฒด ์ถœ๋ ฅ
// 2
// fn ๊ฐ์ฒด ์ถœ๋ ฅ
// 3
// fn ๊ฐ์ฒด ์ถœ๋ ฅ
// 4
// fn ๊ฐ์ฒด ์ถœ๋ ฅ

 

๐Ÿ“Œ ์ฝ”๋“œ 3-1์—์„œ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ ๊ณ ์ฐจ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ „์—ญ๊ฐ์ฒด ์ฐธ์กฐ ์ œ์™ธํ•œ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ๋” ๋งŒ๋“ค์–ด์ค„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜ bind (๋’ค์—์„œ ์„ค๋ช…์„ ์ฝ์œผ๋ฉด ์ด ์ฝ”๋“œ ๋‚ด์šฉ์ด ์ดํ•ด๋  ๊ฒƒ์ž„)

๐Ÿ“Œ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ”๋กœ this๋ฅผ ๋„ฃ์Œ์œผ๋กœ์จ ๋ฐ”๋กœ ๋ฐ”๊นฅ์— ์žˆ๋Š” fn์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ this๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Œ

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 3-3) ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

โœจ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ž€ โ“

- function ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋ฐ”๋กœ this. ์ด๋ฅผ Lexical this๋ผ๊ณ  ๋งํ•จ

- ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์•ˆ์—์„œ this๋Š” ์–ธ์ œ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ฐ€๋ฆฌํ‚ด

- ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด๊ฐ€ ์ •์ ์œผ๋กœ ๊ฒฐ์ •๋˜์ง€ ์•Š๊ณ , ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๋Š”์ง€์— ๋”ฐ๋ผ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•จ

- ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด๊ฐ€ ์ •์ ์œผ๋กœ ๊ฒฐ์ •

- ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ this ๋ฐ”์ธ๋”ฉ ๊ฐ์ฒด ๊ฒฐ์ • ๋ฐฉ์‹์€ ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์ธ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์™€ ์œ ์‚ฌ

- ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” call, apply, bind ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ this๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ

 

const fn = {
  title: "hello world",
  tags : [1,2,3,4],
  showTag(){
    this.tags.forEach((tag)=>{
      console.log(tag);
      console.log(this); //fn
    }); //์—ฌ๊ธฐ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ฐ”๊นฅ, fn ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Œ
  }
}

fn.showTag();

// 1
// fn ๊ฐ์ฒด ์ถœ๋ ฅ
// 2
// fn ๊ฐ์ฒด ์ถœ๋ ฅ
// 3
// fn ๊ฐ์ฒด ์ถœ๋ ฅ
// 4
// fn ๊ฐ์ฒด ์ถœ๋ ฅ

 

 

 

 


โœ…  CASE 4. ์ฝœ๋ฐฑํ•จ์ˆ˜

call, apply, bind 

 

 

 

๐Ÿ“š ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•

function a(x,y,z){
    console.log(this, x,y,z);
}
var b = {
    bb:'bbb'
};

a.call(b, 1,2,3);
a.apply(b, [1,2,3]);

var c = a.bind(b);
c(1,2,3);

var d = a.bind(b, 1,2);
d(3);

//๊ฒฐ๊ณผ 
{ bb: 'bbb' } 1 2 3
{ bb: 'bbb' } 1 2 3
{ bb: 'bbb' } 1 2 3
{ bb: 'bbb' } 1 2 3

๐Ÿ“Œ call : ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ธด ๊ฒƒ์ด this, ๋„˜๊ธฐ ๋‘ ๋ฒˆ์งธ๋ถ€ํ„ฐ๋Š” ์ฐจ๋ก€๋Œ€๋กœ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊น€

๐Ÿ“Œ apply : ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ธด ๊ฒƒ์ด this, ๋ฐฐ์—ด๋กœ ๋„˜๊ธด ๊ฐ๊ฐ์˜ ์š”์†Œ๋“ค์ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋จ

๐Ÿ“Œ ์ฒซ๋ฒˆ์งธ bind : this๋ฅผ a๋กœ ๋„˜๊ฒจ์ฃผ๊ณ , b๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค€ ์ƒํƒœ. ์—ฌ๊ธฐ์„œ c๋ผ๋Š” ๋ฐ”์ธ๋“œ๋œ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜ 1, 2, 3์„ ๋„˜๊ฒจ์ฃผ๋ฉด ๊ฒฐ๊ณผ๊ฐ’์€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ’๊ณผ๋„ ๊ฐ™๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ ๋‘๋ฒˆ์งธ bind : this๋ฅผ a๋กœ ๋„˜๊ฒจ์ฃผ๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ 1, 2๋ฅผ ๋„˜๊ฒจ์ค€ ์ƒํƒœ์—์„œ d๋ผ๋Š” ๋ฐ”์ธ๋“œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ฆ. ๋งŒ๋“  ํ›„ ๊ทธ ํ•จ์ˆ˜์— 3์„ ๋„˜๊ธฐ๋ฉด์„œ ๋‹ค์‹œ ํ˜ธ์ถœ

 

 

 

 

๐Ÿ’ป ์˜ˆ์‹œ ์ฝ”๋“œ 1-1)

var callback = function() {
  console.log(this);
};
var obj = {
  a: 1,
  b: function(cb){
    cb();
  }
}
obj.b(callback);

๐Ÿ“Œ obj.b์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ callback ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋ฐ, ์ด callbackํ•จ์ˆ˜๋Š” this๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜

๐Ÿ“Œ ๊ทธ๋Ÿผ, obj์˜ ๋ฉ”์†Œ๋“œ๋Š” b๋ฅผ ๋ณด๋ฉด, ํ•จ์ˆ˜ cb๊ฐ€ cb๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ์˜ this๋Š” ๋”ฐ๋กœ ์ •ํ•ด๋†“์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ( ๋ฉ”์†Œ๋“œ ์•ž์— this๋ฅผ ์ •ํ•œ ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ) callback ํ•จ์ˆ˜์—์„œ this๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด window(์ „์—ญ๊ฐ์ฒด)๋ผ๊ณ  ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค

๐Ÿ“Œ ์ฆ‰, ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์ „์—ญ๊ฐ์ฒด

 

 

 

๐Ÿ’ป ์˜ˆ์‹œ ์ฝ”๋“œ 1-2)

var callback = function() {
  console.log(this);
};
var obj = {
  a: 1,
  b: function(cb){
    cb.call(this);
  }
}
obj.b(callback);

๐Ÿ“Œ ๋งŒ์•ฝ ์ด ๊ฒฝ์šฐ๋ผ๋ฉด, cb.call(this)์—์„œ this๋ฅผ ๋ฐ”๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ์„ ๋•Œ, this๋Š” b ๋ฉ”์„œ๋“œ ์•ž์— ์žˆ๋Š” obj ํ•จ์ˆ˜๊ฐ€ b ๋ฉ”์„œ๋“œ์˜ ์ฃผ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ์˜ this๋Š” obj๋กœ ์ถœ๋ ฅ

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 2)

var callback = function(){
    console.dir(this); //๋”ฐ๋กœ this๋ฅผ ์ง€์ •ํ•œ ๊ฐ’์ด ์—†์–ด์„œ ์ „์—ญ๊ฐ์ฒด๋กœ ๋‚˜์˜ด
};
var obj = {
    a:1
};
setTimeout(callback, 100);

//this์˜ ๊ฐ’์„ ์ง€์ •ํ• ๋ ค๋ฉด
setTimeout(callback.bind(this), 100);

๐Ÿ“Œ setTimeout(callback, 100) : setTimeout ํ•จ์ˆ˜์—์„œ๋Š” callback ํ•จ์ˆ˜์— this๊ฐ€ ๋”ฑํžˆ ์ •ํ•ด์ง„ ๊ฒƒ์ด ์—†์–ด ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜ด

๐Ÿ“Œ setTimeout(callback.bind(this), 100) : callback ํ•จ์ˆ˜์— this๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, bind๋ฅผ ์“ฐ๋ฉด ๋จ

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 3-1)

document.body.innerHTML += '<div id="a"> ํด๋ฆญํ•˜์„ธ์š” </div';

document.getElementById('a').addEventListener(
    'click',
    function(){
        console.dir(this);
    }
);

๐Ÿ“Œ ์ด๋•Œ this๋Š” html dome element๊ฐ€ ๋‚˜์˜ด. ์™œ๋ƒํ•˜๋ฉด, this๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ทธ ํƒ€๊ฒŸ ๋Œ€์ƒ ์—˜๋ฆฌ๋จผํŠธ๋กœ ํ•˜๋„๋ก ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—๐Ÿ“Œ addEventListner์ฒ˜๋Ÿผ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ this๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•ด๋†“์€ ๊ฒฝ์šฐ๋„ ์–ผ๋งˆ๋“ ์ง€ ์žˆ์Œ

 

 

 

 

 

๐Ÿ’ป ์ฝ”๋“œ 3-2) ๋งŒ์•ฝ this์— ํŠน์ • obj๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด? bind ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋ผ

document.getElementById('a').addEventListener(
    'click',
    function(){
        console.dir(this);
    }.bind(obj)
);

 

 


 

โœ…  5. new ์—ฐ์‚ฐ์ž

- ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ

- ์ƒ์„ฑ์ž ํ•จ์ˆ˜ MyFn๊ฐ€ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ this๊ฐ€ ๋นˆ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค์ •

 

 

๐Ÿ’ป ์ฝ”๋“œ 1)

function MyFn(){
  this.title = "hello world";
  return this;
}


//new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์–ป์Œ
const myfn = new MyFn()

myfn;
//MyFn{title: "hello world"}

 

 

๐Ÿ’ป ์ฝ”๋“œ 2)

function Person(n, a){
    this.name=n;
    this. age = a;
}
var roy = new Person ('์žฌ๋‚จ', 30); //new
console.log(roy);
console.log(window.name, window.age); //์žฌ๋‚จ 30

 

 

 

 


 

 

 

โœจ ๊ฒฐ๋ก 

- this๋Š” ์ด์ฒ˜๋Ÿผ ์–ด๋–ค ์œ„์น˜์— ์žˆ๋А๋ƒ, ์–ด๋””์—์„œ ํ˜ธ์ถœ๋˜๋А๋ƒ, ์–ด๋–ค ํ•จ์ˆ˜์— ์žˆ๋А๋ƒ์— ๋‹ค๋ผ ์ฐธ์กฐ ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ํŠน์„ฑ์ด ์žˆ์Œ

- ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋Š” this๋ฅผ ์ด๋ฏธ ์ง€์ •ํ•ด๋‘” ๊ฒฝ์šฐ๋„ ์žˆ์Œ (์˜ˆ๋ฅผ๋“ค๋ฉด, addEventListner)

-์ด๋ฅผ ์ง์ ‘ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ฐ”์ธ๋”ฉ์„ ํ•ด๋ผ !