JavaScript - This

๊น€๋ฏผ์žฌยท2021๋…„ 8์›” 15์ผ
1

TIL, Deep Javascript

๋ชฉ๋ก ๋ณด๊ธฐ
17/22
post-thumbnail

*๐Ÿ”Study Keyword :

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ ๐Ÿ”‘this๋ฅผ ๊ทน๋ณตํ•˜์ž.

- 1. This ํ‚ค์›Œ๋“œ

  • ๊ฐ์ฒด๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๋ฌถ์€ ๋ณตํ•™์ ‘์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.
  • ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ์ธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” '์‹๋ณ„์ž'๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

1> ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋ฉ”์„œ๋“œ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

<script>
const circle = {
  // ํ”„๋กœํผํ‹ฐ: ๊ฐ์ฒด ๊ณ ์œ ์˜ ์ƒํƒœ
  radius: 5,
  // ๋ฉ”์„œ๋“œ : ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋™์ž‘
  getDiameter(){
   // ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋ฉด
   // ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์ธ circle์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.
    return 2 * circle.radius;
  }
};
console.log(circle.getDiameter())</script>
  • getDiameter ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž circle์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค. ์ด ์ฐธ์กฐ ํ‘œํ˜„์‹์ด ํ‰๊ฐ€๋˜๋Š” ์‹œ์ ์€ getDiameter ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ํ•จ์ˆ˜ ๋ชธ์ฒด๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด๋‹ค.
  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์€ circle ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๊ธฐ ์ง์ „์— ํ‰๊ฐ€๋œ๋‹ค.
    ๋”ฐ๋ผ์„œ getDiameter ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ด๋ฏธ 1.1> ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ํ‰๊ฐ€๊ฐ€ ์™„๋ฃŒ๋˜์–ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๊ณ  1.2> circle ์‹๋ณ„์ž์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ ์ดํ›„์ด๊ธฐ์— 1.3> ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ circle ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ์ž๊ธฐ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์ด์ง€๋„ ๋ฐ”๋žŒ์งํ•˜์ง€๋„ ์•Š๋‹ค.

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

<script>
function Circle(radius){
  // ์ด ์‹œ์ ์—๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.
  ????.radius = radius
}
Circle.prototype.getDiameter = function(){
    // ์ด ์‹œ์ ์—๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.
    return 2 * ????.radius;
};
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.
const circle = new Circle(5)  
</script>
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ž์‹ ์ด ์ƒ์„ฑ'ํ• ' ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.
    ํ•˜์ง€๋งŒ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์€ 2.1>๋จผ์ € ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ์ดํ›„ 2.2>new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜์—ฌ
    ์ฆ‰, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” 2.2> ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด 2.1> ๋จผ์ € ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•ด์•ผํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ์—๋Š” ์•„์ง ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ด์ „์ด๋ฏ€๋กœ
    ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.
  • ๋”ฐ๋ผ์„œ 1>์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” 2>์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŠน์ˆ˜ํ•œ ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    ์ด๋ฅผ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” this๋ผ๋Š” ํŠน์ˆ˜ํ•œ ์‹๋ณ„์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • WHAT ISโ“

  • this๋Š” 1> ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” 2> ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜๋‹ค. this๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • this๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ์ฝ”๋“œ ์–ด๋””์„œ๋“  ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด arguments ๊ฐ์ฒด์™€ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ๋˜์–ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ argument ๊ฐ์ฒด๋ฅผ ์ง€์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋“ฏ this๋„ ์ง€์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋‹จ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’, ์ฆ‰ ๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ

  • ๋ฐ”์ธ๋”ฉ์ด๋ž€ ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.
  • EX> 1. ๋ณ€์ˆ˜ ์„ ์–ธ = ๋ณ€์ˆ˜ ์ด๋ฆ„(์‹๋ณ„์ž) - ํ™•๋ณด๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฃผ์†Œ ๋ฐ”์ธ๋”ฉ &
    1. ๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ = this(ํ‚ค์›Œ๋“œ ๋ถ„๋ฅ˜๋˜์ง€๋งŒ ์‹๋ณ„์ž ์—ญํ• )์™€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ์ฒด ๋ฐ”์ธ๋”ฉ(์—ฐ๊ฒฐ)
  • 1>๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ 2>์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ this๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•œ ์ฝ”๋“œ
<script>
// 2> ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด
const circle = {
  radius: 5,
  getDiameter(){
  // this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  return 2 * this.radius;
  }
};
console.log(circle.getDiameter()) // 10
// 2> ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Circle(radius){
  // this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  this.radius = radius
}
Circle.prototype.getDiameter = function(){
  // this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    return 2 * this.radius;
};
//์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const circle = new Circle(5)
console.log(circle.getDiameter()) / 10
</script>

1> ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด, circle์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
2> ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ'ํ• ' ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
=> ์ด์ฒ˜๋Ÿผ this๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด ๋‹ค๋ฅด๋‹ค.
=> ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ this์— ๋ฐ”์ธ๋”ฉ ๋  ๊ฐ’,
๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ์ด '๋™์ '์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

  • this๋Š” ์ฝ”๋“œ ์–ด๋””์—์„œ๋“  ์ฐธ์กฐ ๊ฐ€๋Šฅํ•ด ์ „์—ญ์—์„œ๋“  ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋„ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
<script>
// this๋Š” ์–ด๋””์„œ๋“  ์ฐธ์กฐ๊ฐ€๋Šฅ
// ์ „์—ญ์—์„œ this๋Š” ์ „์—ญ ๊ฐ์ฒด window ๊ฐ€๋ฆฌํ‚จ๋‹ค
console.log(this) // window
function square(num){
  // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this๋Š” ์ „์—ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  console.log(this) // window
  return num * num;
}
square(3);
const person = {
  name : 'jamie',
  // ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  getName() {
    console.log(this); // person { name: jamie,getName: f}
    return this.name
  }
}
console.log(person.getName()) // jamie
function Person(name){
  this.name = name
  // ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  console.log(this); // Person {name: 'jamie'}
}
const me = new Person('jamie')
</script>
  • this๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

2. ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹๊ณผ this ๋ฐ”์ธ๋”ฉ

๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ(this์— ๋ฐ”์ธ๋”ฉ๋  ๊ฐ’)์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹, ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

-๐Ÿ”—๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์™€ ๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ์€ ๊ฒฐ์ • ์‹œ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค.

-ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์ธ **๐Ÿ”—๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

  • ๋ฐ˜๋ฉด ๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์ ์— this์— ๋ฐ”์ธ๋”ฉ ๋  ๊ฐ’์ด ๊ฒฐ์ •๋œ๋‹ค.
  • ํ•จ์ˆ˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ ๋œ๋‹ค.
  1. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  2. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
  3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ
  4. Function.prototype.apply/call/bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ
<script>
// this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฒฐ์ •
const foo = function (){
  console.dir(this)
};
// ๋™์ผํ•œ ํ•จ์ˆ˜๋„ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
// 1. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
// foo ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ 
// => ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” '์ „์—ญ ๊ฐ์ฒด' window ๊ฐ€๋ฆฌํ‚ด
//foo(); // window
// 2. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
// foo ํ•จ์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•˜์—ฌ ํ˜ธ์ถœ
// => foo ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” '๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด' obj ๊ฐ€๋ฆฌํ‚ด
const obj = { foo };
obj.foo(); // obj {  foo: f }
// 3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ
// foo ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ
// => foo ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” '์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค' ๊ฐ€๋ฆฌํ‚ด
new foo(); // foo {};
// 4. Function.prototype.apply/call/bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ
// => foo ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” '์ธ์ˆ˜์— ์˜ํ•ด ๊ฒฐ์ •'
const bar = {name: 'bar'};
foo.call(bar) // bar
foo.apply(bar) // bar
foo.bind(bar)(); // bar
</script>

โ–ถ 2.1> ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ this์—” ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • ์ „์—ญ ํ•จ์ˆ˜, ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ 2.1>์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์—๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • ๋‹ค๋งŒ this๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์—๋Š” this๋Š” ์˜๋ฏธ๊ฐ€ ์—†์–ด stric mode๊ฐ€ ์ ์šฉ๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์—” undefined๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
<script>
function foo(){
  // 'use strict' ๋ชจ๋“œ์—์„  ๋ชจ๋‘ undefined
  console.log(`foo's this ${this}`)// window
  function bar {
    console.log(`bar's this ${this}`)// window
  }
   bar();
}
foo();
</script>
  • ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜ํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜๋„ 2.1>์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜๋ฉด ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
<script>
// var ํ‚ค์›Œ๋“œ ์„ ์–ธํ•œ ์ „์—ญ๋ณ€์ˆ˜ value๋Š” ์ „์—ญ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ
var value = 1;
// const ํ‚ค์›Œ๋“œ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜ value๋Š” ์ „์—ญ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐX
// const value = 1;
const obj = {
  value : 100,
  foo () {
    console.log(`foo's this ${this}`)// "foo's this obj {value:100, foo: f }
    console.log(`foo's this.value ${this.value}`)// "foo's this.value 100"
  // ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜ํ•œ ์ค‘์ฒฉํ•จ์ˆ˜
    function bar(){
      console.log(`bar's this ${this}`)// window
      console.log(`bar's this.value ${this.value}`)// 1
      // ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜ํ•œ ์ค‘์ฒฉํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด
      // ์ค‘์ฒฉํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์—” ์ „์—ญ๊ฐ์ฒด ๋ฐ”์ธ๋”ฉ
    }
    bar();
  }
};
obj.foo();
</script>
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ 2.1>์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์—๋„ ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
<script>
// var ํ‚ค์›Œ๋“œ ์„ ์–ธํ•œ ์ „์—ญ๋ณ€์ˆ˜ value๋Š” ์ „์—ญ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ
var value = 1;
// const ํ‚ค์›Œ๋“œ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜ value๋Š” ์ „์—ญ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐX
// const value = 1;
const obj = {
  value : 100,
  foo () {
    console.log(`foo's this ${this}`)// "foo's this : obj {value:100, foo: f }
    // ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์—” ์ „์—ญ๊ฐ์ฒด ๋ฐ”์ธ๋”ฉ
    setTimeout(function(){
      console.log(`callback's this ${this}`)// "callback's this : objectwindow"
      console.log(`callback's this.value ${this.value}`)// "callback's this.value : 1"
    }, 100);
  }
};
obj.foo();
</script>
  • ์ด์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ ๋ชจ๋“  ํ•จ์ˆ˜(์ค‘์ฒฉ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํฌํ•จ) ๋‚ด๋ถ€์˜ this์—” ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค

-๋ฌธ์ œ์ 

  • ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜ํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ์—๊ฒŒ ์ „๋‹ฌํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€
    2.1> ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ๋  ๋•Œ ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฑด ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
  • ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜(๋ณด์กฐํ•จ์ˆ˜)๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋•๋Š” 'ํ—ฌํผ ํ•จ์ˆ˜'์˜ ์—ญํ• ์„ ํ•˜๊ธฐ์—
    ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ผ๋ถ€ ๋กœ์ง์„ ๋Œ€์‹ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋‹ค,
    ๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ํ•จ์ˆ˜์ธ ๋ฉ”์„œ๋“œ์™€ ์ค‘์ฒฉํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ this๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ 'ํ—ฌํผ ํ•จ์ˆ˜'๋กœ ๋™์ž‘ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.

-ํ•ด๊ฒฐ์ฑ…-

  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ ์ค‘์ฒฉ ํ•จ์ˆ˜๋‚˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ this ๋ฐ”์ธ๋”ฉ์„ ๋ฉ”์„œ๋“œ์˜ this ๋ฐ”์ธ๋”ฉ๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๋‹ค.
<script>
var value = 1;
const obj = {
  value : 100,
  foo () {
    // ๋ฐฉ๋ฒ• 1. this ๋ฐ”์ธ๋”ฉ(obj)์„ ๋ณ€์ˆ˜์— ํ• ๋‹น
    const that = this
    console.log(`foo's this ${this}`)// "foo's this : obj {value:100, foo: f }
    // ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this๋Œ€์‹  that์„ ์ฐธ์กฐ
    setTimeout(function(){
      console.log(`callback's this.value : ${that.value}`)// "callback's this.value : 100"
    }, 100);
    // ๋ฐฉ๋ฒ• 2. bind ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉ 
	/*setTimeout(function(){
      console.log(`callback's this.value : ${that.value}`)// "callback's this.value : 100"
    }.bind(this),100};
    */
   // ๋ฐฉ๋ฒ• 3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๋ฐ”์ธ๋”ฉ
	/*setTimeout(() => console.log(`callback's this.value : ${that.value}`,100) // "callback's this.value : 100"
   */
  }
};
obj.foo();
</script>
  • ๋ฐฉ๋ฒ• 2> ๋Š” this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š” Function.prototype.apply/call/bind ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ 
    ๋ฐฉ๋ฒ• 3> ์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด this๋ฅผ ์ผ์น˜์‹œ๋Š” ๊ฒƒ์ด๋‹ค.

โ–ถ 2.2> ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this์—๋Š” 2.2.> ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด, 2.2.>๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์•ž์˜ ๋งˆ์นจํ‘œ(.) ์—ฐ์‚ฐ์ž ์•ž์— ๊ธฐ์ˆ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • ์ฃผ์˜ ํ•  ๊ฑด ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
<script>
const person = {
  name : 'jamie',
  getName () {
    // ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ
    return this.name;
  }
};
// => ๋ฉ”์„œ๋“œ getName()์„ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋Š” person์ด๋‹ค.
console.log(person.getName()); // jamie
const anotherPerson = {
  name: 'Kim'
};
// 1> getName ๋ฉ”์„œ๋“œ๋ฅผ anotherPerson ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ• ๋‹น
anotherPerson.getName = person.getName;
// getName ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋Š” anotherPerson 
console.log(anotherPerson.getName()); // kim
// getName ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹น
const getName = person.getName;
// 2> getName ๋ฉ”์„œ๋“œ๋ฅผ 1. ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ
// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•œ getName ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this.name์€ 
// ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ window.name๊ณผ ๊ฐ™๋‹ค.
console.log(getName()); // ''
</script>
  • getName ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ๋œ ํ•จ์ˆ˜๋กœ์„œ person ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ์ •์˜๋˜์–ด person ๊ฐ์ฒด์˜ getName ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” person ๊ฐ์ฒด์— ํฌํ•จ๋œ ๊ฒƒ์ด ์•„๋‹Œ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๋ณ„๋„์˜ ๊ฐ์ฒด๋กœ getName ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.
  • getName ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด, getName ๋ฉ”์„œ๋“œ๋Š” ์œ„ ์ฝ”๋“œ ์˜ˆ์‹œ ์ฒ˜๋Ÿผ
    1> ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋  ์ˆ˜ ๋„ ์žˆ๊ณ ,
    2> ์ผ๋ฐ˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ๋  ์ˆ˜ ๋„ ์žˆ๋‹ค.
    => ๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ํ”„๋กœํผํ‹ฐ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์™€ ๊ด€๊ณ„์—†๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋œ this๋„ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
<script>
function Person(name) {
  return this.name = name;
}
Person.prototype.getName = function(){
  return this.name
}
const me = new Person('Kim');
// 1> getName ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋Š” me
console.log(me.getName());// => Kim
Person.prototype.name = 'Jamie';
// 2> getName ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋Š” Person.prototype
console.log(Person.prototype.getName());// => Jamie
</script>
  • 1๋ฒˆ> ๊ฒฝ์šฐ getName ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋Š” me๋กœ getName ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์ธ me๋ฅผ ๊ฐ€๋ฅด์ผœ this name์€ 'Kim'์ด๋‹ค.
  • 2๋ฒˆ> ๊ฒฝ์šฐ getName ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋Š” Person.prototype๋กœ Person.prototype๋„ ๊ฐ์ฒด๋กœ ์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ด getName ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” Person.prototype๋ฅผ ๊ฐ€๋ฅด์ผœ this name์€ 'Jamie'์ด๋‹ค.

โ–ถ 2.3> ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ

  • 2.3>์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์—๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ (๋ฏธ๋ž˜์—) ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค
<script>
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Circle(radius){
  // ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
  this.radius = radius;
  this.getDiameter =  function(){
    return 2 * this.radius;
  }
}
//์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const circle1 = new Circle(5)
const circle2 = new Circle(10)
console.log(circle1.getDiameter()) / 10
console.log(circle2.getDiameter()) / 20
//new ์—ฐ์‚ฐ์ž ํ˜ธ์ถœ X ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ
const circle3 = Circle(15);
console.log(circle2) // ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ Circle์— ๋ฐ˜ํ™˜๋ฌธ X => undefined ๋ฐ˜ํ™˜ 
console.log(radius) // ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ Circle ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ „์—ญ๊ฐ์ฒด ๊ฐ€๋ฆฌํ‚ด
</script>
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ๋’ค new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.
    ๋‹จ, new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค!

โ–ถ 2.4> Function.prototype.apply/call/bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ

  • apply/call/bind ๋ฉ”์„œ๋“œ๋Š” Function.prototype์˜ ๋ฉ”์„œ๋“œ๋กœ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์ƒ์† ๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ท 2.4.1> Function.prototype.apply/call ๋ฉ”์„œ๋“œ

  • 2.4.1> Function.prototype.apply/call ๋ฉ”์„œ๋“œ๋Š”
    1> this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด์™€ 2> ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
/** 
<script>
์ฃผ์–ด์ง„ this ๋ฐ”์ธ๋”ฉ๊ณผ ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
@param thisArg - this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด
@param argsArray - ํ•จ์ˆ˜์—๊ฒŒ ์ „๋‹ฌํ•  ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐฐ์—ด ๋˜๋Š” ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด
@return ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’ 
**/
Function.prototype.apply(thisArg[, argsArray])
/** 
์ฃผ์–ด์ง„ this ๋ฐ”์ธ๋”ฉ๊ณผ ,๋กœ ๊ตฌ๋ถ„๋œ ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
@param thisArg - this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด
@param arg1, arg2, ...  - ํ•จ์ˆ˜์—๊ฒŒ ์ „๋‹ฌํ•  ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ
@return ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’ 
**/
Function.prototype.call(thisArg[, args1[,arg2[,...]]]) 
</script>
  • apply์™€ call ๋ฉ”์„œ๋“œ์˜ ๋ณธ์งˆ์ ์ธ ๊ธฐ๋Šฅ์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    apply์™€ call ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ฒซ ๋ฒˆ์žฌ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํŠน์ • ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์˜ this์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
<script>
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
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};
</script>
  • apply์™€ call ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹๋งŒ ๋‹ค๋ฅผ ๋ฟ this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฑด ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
<script>
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function getThisBinding(){
  console.log(arguments)
  return this;
}
// this ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด
const thisArg = {a:1};
// 1> getThisBinding ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ๊ฐ์ฒด๋ฅผ getThisBinding ํ•จ์ˆ˜์˜ this์— ๋ฐ”์ธ๋”ฉ
// 2> apply ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ `์ธ์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฌถ์–ด` ์ „๋‹ฌ
console.log(getThisBinding.apply(thisArg, [1, 2, 3]))
//  Arguments(3) { 0: 1, 1: 2, 2: 3, callee:f, Symbol(Symbol.iterator): f}
//  {a:1};
// 2> call ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ `์ธ์ˆ˜๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๋ฆฌ์ŠคํŠธ ํ˜•์‹`์œผ๋กœ ์ „๋‹ฌ
console.log(getThisBinding.call(thisArg, 1, 2, 3))
//  Arguments(2) { 0: 1, 1: 2, 2: 3, callee:f, Symbol(Symbol.iterator): f}  //  {a:1};
</script>
  • apply ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ '๋ฐฐ์—ด'๋กœ ๋ฌถ์–ด ์ „๋‹ฌํ•˜๊ณ  call ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ '์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๋ฆฌ์ŠคํŠธ' ํ˜•์‹์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • apply/call ๋ฉ”์„œ๋“œ์˜ ๋Œ€ํ‘œ์  ์šฉ๋„๋Š” arguments ๊ฐ์ฒด์™€ ๊ฐ™์€ ์œ ์‚ฌ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
    arguments ๊ฐ์ฒด๋Š” ๋ฐฐ์—ด์ด ์•„๋‹ˆ๊ธฐ์— Array.prototype.slice๊ฐ™์€ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆœ ์—†์ง€๋งŒ apply์™€ call ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค.
<script>
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function converArgsToArr(){
  console.log(arguments)
  // arguments ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
  // slice ๋ฉ”์„œ๋“œ๋ฅผ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฐ์—ด์˜ ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ
  const arr = Array.prototype.slice.call(arguments);
  //  const arr = Array.prototype.slice.apply(arguments);
  console.log(arr);
  return arr;
}
converArgsToArr(1,2,3,4); // [1, 2, 3, 4]
</script>

โ–ท 2.4.2> Function.prototype.bind ๋ฉ”์„œ๋“œ

  • Function.prototype.bind ๋ฉ”์„œ๋“œ๋Š” apply์™€ call ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  this๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋งŒ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.
<script>
function getThisBinding(){
  return this;
}
// this ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด
const thisArg = {a:1};
// bind ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜์— this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด ์ „๋‹ฌ.
// bind ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœX.
console.log(getThisBinding.bind(thisArg)); // getThisBinding
// bind ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœX๊ธฐ์— ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.
console.log(getThisBinding.bind(thisArg)()); // {a:1};
</script>
  • bind ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ์˜ this์™€ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ this๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • person.foo์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ด์ „์ธ 1๋ฒˆ> ์‹œ์ ์—์„œ this๋Š” foo ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด, person ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ person.foo์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋œ 2๋ฒˆ> ์‹œ์ ์—์„  this๋Š” ์ „์—ญ๊ฐ์ฒด window๋ฅผ ๊ฐ€๋ฆฌ์ผœ person.foo ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this.name์€ window.name๊ณผ ๊ฐ™๋‹ค.
<script>
const person = {
  name: 'Jamie',
  foo(callback) {
    // 1๋ฒˆ>
    setTimeout(callback, 100)
  }
};
person.foo(function(){ // 2๋ฒˆ>
  console.log(`Hi, bro I'm ${this.name}`)
});
// Hi, bro I'm .
// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆœ ๋‚ด๋ถ€์˜ this.name์€ window name
// ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ window name์€ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋นŒํŠธ์ธ ํ”„๋กœํผํ‹ฐ๋กœ ๊ธฐ๋ณธ๊ฐ’ ''
</script>
  • person.foo ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜ person.foo๋ฅผ ๋•๋Š” ํ—ฌํผํ•จ์ˆ˜ ์—ญํ• ์„ ํ•˜๊ธฐ์— this๊ฐ€ ์ƒ์ดํ•˜๋ฉด ๋ฌธ๋งฅ์ƒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ์— bind ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์™€ ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋ฅผ ์ผ์น˜์‹œํ‚ฌ์ˆ˜ ์žˆ๋‹ค.
<script>
const person = {
  name: 'Jamie',
  foo(callback) {
    // bind ๋ฉ”์„œ๋“œ๋กœ callback ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this ๋ฐ”์ธ๋”ฉ์„ ์ „๋‹ฌ
    setTimeout(callback.bind(this), 100)
  }
};
person.foo(function(){
  console.log(`Hi, bro I'm ${this.name}`)
});
// Hi, bro I'm Jamie
</script>

*๐Ÿ’กconclusion

  • *this๋Š” 1> ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ์ž์‹  ํ˜น์€ 2> ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด ๋‹ฌ๋ผ์ง„๋‹ค.
  • ๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹(1. ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ/2. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ/3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ 4.call,apply,bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ)์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.
  • ๐Ÿ‘‰this ๋ฐ”์ธ๋”ฉ์€ this(์‹๋ณ„์ž ์—ญํ• )์™€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ `์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.
    - ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ - ์ „์—ญ ๊ฐ์ฒด/
    ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ - ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด/
    ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ - ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค/
    call,apply,bind ๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ ์‹œ - ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ ๊ฐ์ฒด = this
    ๊ฐ€ ๋œ๋‹น

#๐Ÿ“‘Study Source

  1. ์ฑ… - ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive (376p-392p)

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐthis์˜ ๊ฐ’์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„  ์„ ์–ธํ•  ๋•Œ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ, ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ํด๋กœ์ €๊ฐ€ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ˜ธ์ถœํ•  ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ‘œ์ ์œผ๋กœ this๊ฐ€ ์žˆ๋‹ค.

ํ•จ์ˆ˜์˜ this๊ฐ’์ด ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” bind ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.

์ฝ”๋“œ์ข…๋‹˜ ์ฝ”๋“œ ์ •๋ฆฌ

const someone = {
  name: 'jamie',
  whoAmI : function(){
  console.log(this)
  }
};
// whoAmI ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๋…€์„์€ ๋ฐ”๋กœ someone 
someone.whoAmI(); // {name: "jamie", whoAmI: f}
// this๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.
// ์ฆ‰ ํ˜ธ์ถœ์„ ๋ˆ„๊ฐ€ ํ–ˆ๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง„๋‹ค
const myWhoAmI = someone.whoAmI;
// myWhoAmI ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๋…€์„์€ ๋ฐ”๋กœ global, window์ด๋‹ค
myWhoAmI(); // window

์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”


> ์ฝ”๋“œ์ข…๋‹˜ ์ฝ”๋“œ ์ •๋ฆฌ
HTML ๋ฌธ์„œ์˜ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค. HTML ๋ฌธ์„œ์˜ ์ฝ˜ํ…์ธ (contents) ์˜์—ญ์ž…๋‹ˆ๋‹ค. ```
profile
์ž๊ธฐ ์‹ ๋ขฐ์˜ ํž˜์„ ๋ฏฟ๊ณ  ์‹ค์ฒœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

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