[JS | ๊ฐœ๋…์ •๋ฆฌ ] this!!!๐Ÿคฆโ€โ™€๏ธ

zamanยท2022๋…„ 9์›” 8์ผ
0

Javascript | Basics

๋ชฉ๋ก ๋ณด๊ธฐ
3/8
post-thumbnail

๐Ÿ‘‰Javascript์—์„œ์˜ this

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

์ฆ‰ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ ์ž๊ธฐ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜์ด๋‹ค.


๐Ÿค” this๋Š” ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ?

๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋‚ด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
โžก๏ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋ฉด ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

// object
const circle = {
  	// property
	radius: 5;
  	// method
    getDiameter(){
        // ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด circle๋ฅผ ์ฐธ์กฐํ•ด radius๋ฅผ ์‚ฌ์šฉ
    	return circle.radius*2; 
        }
}

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ์ž๊ธฐ ์ž์‹ ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค
์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ

function Circle(r){
  ????.radius = r; 
}

Circle.prototype.getDiameter = () => {
  return ????.radius * 2;
};

const circle = new Circle(3); // ๋ˆ„๊ตฌ์„ธ์š”?

???? ์˜ ์‹œ์ ์—์„  ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค
โžก๏ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜(= new ํด๋ž˜์Šค())๊ฐ€ ์žˆ์–ด์•ผ ํ•จ

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ์—์„  ์•„์ง ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์‚ฐํ•˜์ง€ ์•Š์Œ
โžก๏ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

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

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

์ฐธ๊ณ ๋กœ this๋Š” ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ, ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ง€์—ญ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
(๋‹จ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋จ - this binding)

์œ„์˜ ์ฝ”๋“œ๋ฅผ this๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜์ •ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค

const circle = {
  radius: 5;
  
  getDiameter(){
    // this: circle
  	return this.radius * 2; 
  }
console.log(circle.getDiameter()); // 10

function Circle(r){
    // ์ด๋•Œ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค
 	this.radius = r; 
}

Circle.prototype.getDiameter = () => {
  // ์ด๋•Œ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค
  return this.radius * 2;
};

const circle = new Circle(3); 
console.log(circle.getDiameter()); // 6

๐Ÿ˜Ž this ์˜ˆ์‹œ

console.log(this); // window 1. ์ „์—ญ์—์„œ this๋Š” window

function example(num){
  console.log(this); // window 2. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” window
}

const person = {
  name: 'jaman',
  getName(){
    console.log(this); //  3. ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด {name:"jaman", getName: function}
    return this.name; // jaman 
  }
};

function Person2(name){
  this.name = name;
  console.log(this); // 4. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค Person2 {name: "zaman"} 
}
const me = new Person2("zaman");

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ this์— ๋ฐ”์ธ๋”ฉ ๋  ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ฆ‰ binding์ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค!
(๋‹จ, strict๋ชจ๋“œ์— ๋”ฐ๋ผ์„œ ๋ฐ”๋€Œ๊ธฐ๋„ํ•จ)


๐Ÿ–‡ this ๋ฐ”์ธ๋”ฉ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด ์ค‘ ์ผ๊ธ‰๊ฐ์ฒด๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
1. ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
2. ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ
3. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉ

๋”ฐ๋ผ์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋‹ค์–‘ํ•œ๋ฐ
1. ๋‹จ๋… ํ˜ธ์ถœ func()
2. ํŠน์ • ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœ ๊ฐ์ฒด1.func()
3. ๋™์ผํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์˜ํ•ด ํ˜ธ์ถœ ๊ฐ์ฒด2.func()

๊ฐ™์€ ํ•จ์ˆ˜๋ผ๋„ ์–ด๋–ค ๊ฐ์ฒด์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š”์ง€์— ๋”ฐ๋ผ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ๋‹ฌ๋ผ์ง„๋‹ค(function - this -> some object)
ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด๋•Œ this๋„ ํ•จ๊ป˜ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

this์™€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ โ†’ this binding
๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค this๊ฐ€ ๋™์ ์œผ๋กœ ๊ฒฐ์ •

๊ทธ๋Ÿผ ์ด์ œ this๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž

this ๋ฐ”์ธ๋”ฉ ๊ทœ์น™

1. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ โ†’ ๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ
2. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ โ†’ ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ
3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ โ†’ new ๋ฐ”์ธ๋”ฉ
4. Function.prototype.apply | call | bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ โ†’ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ

1.๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ(์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ)

: this์˜ ๊ธฐ๋ณธ ๊ทœ์น™์œผ๋กœ ๋‚˜๋จธ์ง€์— ํ•ด๋‹น๋˜์ง€ ์•Š์œผ๋ฉด ์ด๊ฑฐ

์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ this์— ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ

  • browser: window
  • node: global

'use strict' mode์—์„  undefined์— ๋ฐ”์ธ๋”ฉ
โžก๏ธ this๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜ ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์—์„  ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ

function ex(){
  console.log("ex's this?", this); // window
  function innerEx(){
	console.log("innerEX's this?", this); // window
	}
  innerEx(); // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
}
ex(); // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ

cf) ์ค‘์ฒฉ ํ•จ์ˆ˜ & ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ
: ์ค‘์ฒฉ ํ•จ์ˆ˜์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ผ๋ถ€ ๋กœ์ง์„ ๋Œ€์‹ ํ•˜๋Š” ๊ฒฝ์šฐ, this๋กœ ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜์–ด ์„œ๋กœ๊ฐ„ this๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

โžก๏ธ ์ค‘์ฒฉ์ด๋‚˜ ์ฝœ๋ฐฑ์—์„œ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ผ๋ฐ˜ํ•จ์ˆ˜๋กœ ์„ ์–ธ๋˜์–ด this๊ฐ€ ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค๋ฉด ์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ์ˆ˜์›”ํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ค์›€

// ์ค‘์ฒฉํ•จ์ˆ˜
const obj = {
  foo() {
    function boo() {
      console.log(this); // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์„ ์–ธ ๋”ฐ๋ผ์„œ ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ window
    }
    boo();
  },
};

obj.foo();
// setTimeout callback
const obj = {
  foo() {
    setTimeout(function () {
      console.log(this); // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์„ ์–ธ ๋”ฐ๋ผ์„œ ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ window
    }, 0);
  },
};

obj.foo();

๊ทธ๋Ÿผ this๋ฅผ ํ†ต์ผํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

// ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค
// this๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉ
const example = {
  title: "what is this?",
  getTitle(){
    const self = this; // self๋ฅผ ๋งŒ๋“ค์–ด ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก -> example
    setTimeout(function(){
      console.log(self.title); // example.title
    }, 0);
  },
};

example.getTitle(); // what is this?

2. ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)

: ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด . ์•ž์˜ ๊ฐ์ฒด(์—ฌ๊ธฐ์„œ๋Š” inner!)

const outer = {
  inner:{
    printThis(){
      console.log(this); // inner
    },
  },
};

outer.inner.printThis();

3. new ๋ฐ”์ธ๋”ฉ(์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ)

: new ๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ

function People(name){
  this.name = name;   // this๋Š” me!
}

const me = new Someone('zaman');

4. ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ(Function.prototype.apply | call | bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ)

: apply, call, bind์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ
์„ธ ๋ฉ”์†Œ๋“œ ๋ชจ๋‘ Function.prototype์˜ ๋ฉ”์†Œ๋“œ๋กœ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Function.prototype.apply( thisArg: this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด, argsArray: ํ•จ์ˆ˜์—๊ฒŒ ์ „๋‹ฌํ•  ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐฐ์—ด / ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด)
Function.prototype.call( thisArg: this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด, arg1, arg2, ...: ์ „๋‹ฌํ•  ์ธ์ˆ˜๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ „๋‹ฌ)
Function.prototype.bind( thisArg: this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด, arg1, arg2, ...: ์ธ์ˆ˜)

apply, call์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ bind๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœํ•ด์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค

๐Ÿคœ ๐Ÿค› ๊ทœ์น™์ด ์ค‘์ฒฉ๋˜๋Š” ๊ฒฝ์šฐ

๊ทœ์น™์ด ์ค‘์ฒฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ์šฐ์„ ์ˆœ์œ„๋„ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž
๊ธฐ๋ณธ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๊ธฐ๋ณธ + ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ
์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด new + ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ

๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ(Function.prototype.apply | call | bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ) vs ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)

const example = {
  title: "what is this?",
  getTitle(){
   console.log(this.name)
  },
};
// this๋ฅผ example๋กœ ์•”์‹œ์  ๋ฐ”์ธ๋”ฉํ•ด์คŒ (this.title === "what is this?")

example.getTitle.bind({title:'bind!!!'})(); 
// bind method๋ฅผ ์‚ฌ์šฉํ•ด this๋ฅผ {title:'bind!!!'} ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•ด์คŒ  (this.title === "bind!!!")

โžก๏ธ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ์ด ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Œ

๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ(Function.prototype.apply | call | bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ) vs new ๋ฐ”์ธ๋”ฉ(์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ )

function setTitle(title){
  this.name = name;
}
let example = {
  title: 'what is this',
};

const setTitleBindExample = setTitle.bind(example); // ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ (this.title = 'what is this')
// setTitleํ•จ์ˆ˜์— example์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ

example = new TitleBindExample('this is this'); // new ๋ฐ”์ธ๋”ฉ(this.title = 'this is this')

console.log(example.title); // this is this

โžก๏ธ new ๋ฐ”์ธ๋”ฉ์ด ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Œ

์šฐ์„  ์ˆœ์œ„
new > ๋ช…์‹œ์  > ์•”์‹œ์  > ๊ธฐ๋ณธ

๐Ÿน ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ this

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ES6์—์„œ ๋„์ž…๋œ ๋ฌธ๋ฒ•์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์™€ ๋ฐ”์ธ๋”ฉ์—์„œ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋‹ค.

์•ž์„œ ๋งํ–ˆ๋“ฏ this๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•จ๊ป˜ ๊ฒฐ์ •๋˜๋Š”๋ฐ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ this ๋ฐ”์ธ๋”ฉ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค

์ฆ‰, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ
โžก๏ธ ๋”ฐ๋ผ์„œ this ํ˜ธ์ถœ ์‹œ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this์— ์ ‘๊ทผ (Lexical this)

๋˜ํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this ๋ฐ”์ธ๋”ฉ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ(apply/call/bind)์„ ํ•ด์ฃผ๋”๋ผ๋„ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” this๋Š” ๊ต์ฒด๋˜์ง€ ์•Š๋Š”๋‹ค

const arrow = {
  name: 'this in arrow function',
  printName: () => {
    console.log(this.name);
  },
};

arrow.printName(); // ๋ธŒ๋ผ์šฐ์ €์—์„  ๋นˆ ๋ฌธ์ž์—ด(window ๊ฐ์ฒด์˜ name์ด ๋นˆ๋ฌธ์ž์—ด๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ), ๋…ธ๋“œ์—์„  undefined๊ฐ€ ์ถœ๋ ฅ๋จ

์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โž• ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๊ฐ์ฒด๊ฐ€ ์ „์—ญ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ ES6 ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

const arrow = {
  name: 'this in arrow function',
  printName(){
    console.log(this.name);
  },
};

arrow.printName();

ํด๋ž˜์Šค์—์„œ์˜ this

class์—์„  ๊ธฐ๋ณธ์ ์œผ๋กœ strict mode๊ฐ€ ์ ์šฉ!

์œ„์—์„œ ์—„๊ฒฉ ๋ชจ๋“œ์—์„  undefined๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ๊นŒ
์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ด๋ถ€์—์„œ this ํ˜ธ์ถœ์‹œ ํด๋ž˜์Šค๋กœ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ
โ†’ ๋ฉ”์„œ๋“œ ๋‚ด ์ค‘์ฒฉํ•จ์ˆ˜๋‚˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋“ฑ์„ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์„ ์–ธ, ํ˜ธ์ถœ ์‹œ this๋กœ undefined



์š”์•ฝ

this๋Š” ์™œ ํ•„์š”ํ•œ๊ฐ€?

: ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ์—์„  ์•„์ง ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜์Œ ๋”ฐ๋ผ์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๊ฐ€ ํ•„์š” โžก๏ธ this (self-referencing variable)

this binding?

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

๋ฐ”์ธ๋”ฉ ์ข…๋ฅ˜ ๋ฐ ์šฐ์„  ์ˆœ์œ„

  1. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ(new ๋ฐ”์ธ๋”ฉ) - ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ
  2. apply, call, bind ๊ฐ„์ ‘ํ˜ธ์ถœ(๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ) - ์ฒซ๋ฒˆ์งธ ์ธ์ž ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ
  3. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ(์•”์‹œ์  ๋ฐ”์ธ๋”ฉ) - ํ˜ธ์ถœ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ
  4. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ(๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ) - ์ „์—ญ ๊ฐ์ฒด or undefined๋กœ ๋ฐ”์ธ๋”ฉ

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

  • this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์Œ
  • ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this์— ์ ‘๊ทผ

class

  • ๋‚ด๋ถ€ -> ์—„๊ฒฉ๋ชจ๋“œ
  • ์ผ๋ฐ˜์ ์œผ๋กœ this๋Š” ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด
  • ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์„ ์–ธ, ํ˜ธ์ถœ ์‹œ this๋Š” undefined

์ฐธ์กฐ
javascript deep dive
https://www.youtube.com/watch?v=DTX52Pv7PZM

profile
๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ธฐ ์œ„ํ•œ ์•„์นด์ด๋ธŒ ๐Ÿ˜Ž

0๊ฐœ์˜ ๋Œ“๊ธ€