[JavaScript] this

ํ˜œ๋ฆฐยท2022๋…„ 12์›” 8์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
20/21
post-thumbnail

this


this๋Š” JAVA์—์„  ์ž์‹ ์„ ๊ฐ€๋ฅดํ‚ค๊ฑฐ๋‚˜ ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜์ด๋‹ค.
ํ•˜์ง€๋งŒ, JavaScript์—์„œ์˜ this๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์—๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

๐Ÿ’๐Ÿปโ€โ™€๏ธ this๋ž€?

  • JAVA
    - ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜์ด๋‹ค.
  • JavaScript
    - this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ window๋‹ค.
    - ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด(this์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ฐ์ฒด)๋Š” ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽ€ ๋ฐ”์ธ๋”ฉ์€ ๋ญ˜๊นŒ?

  • ๋ฐ”์ธ๋”ฉ์€ this์™€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

โ“ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ this๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ์ด์œ 

  • this๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ(์Šค์ฝ”ํ”„์ฒด์ธ, ๋ณ€์ˆ˜ ๊ฐ์ฒดํ™”, this๋ฐ”์ธ๋”ฉ)๋  ๋•Œ ๊ฒฐ์ •๋œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, this๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฒฐ์ •๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.



ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ์‹


ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์ด 4๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


(1) ํ•จ์ˆ˜ ํ˜ธ์ถœ

const foo = function() {
 console.dir(this);
}

foo(); // this๋Š” window

(2) ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

const foo = function() {
 console.dir(this);
}

const obj = {
	foo : foo
};

obj.foo(); // this๋Š” obj

(3) ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ

  • JavaScript์—์„œ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ด๊ธฐ๋„ ํ•˜๋‹ค.
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ new๋ฅผ ๋ช…์‹œํ•˜๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜(instance)๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ƒ์„ฑ์ž ํ•จ์ˆ˜(foo)๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋œ this๋Š” ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด(instance)๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋œ๋‹ค.
const foo = function() {
 console.dir(this);
}

const instance = new foo(); // this๋Š” instance

(4) apply/call ํ˜ธ์ถœ

const foo = function() {
 console.dir(this);
}

const bar = {
	name : 'bar'
};

foo.apply(bar); // this๋Š” bar
foo.call(bar); // this๋Š” bar



1. ํ•จ์ˆ˜ ํ˜ธ์ถœ


  • ๊ธฐ๋ณธ์ ์œผ๋กœ this๋Š” ์ „์—ญ๊ฐ์ฒด(Global Object)์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • ์ „์—ญ๊ฐ์ฒด(Global Object)
    • ๋ชจ๋“  ๊ฐ์ฒด์˜ ์œ ์ผํ•œ ์ตœ์ƒ์œ„ ๊ฐ์ฒด
    • Browser-side(๋ธŒ๋ผ์šฐ์ €): window๊ฐ์ฒด
    • Server-side(Node.js): global๊ฐ์ฒด

(1) ๋‚ด๋ถ€ํ•จ์ˆ˜

์ „์—ญํ•จ์ˆ˜๋Š” ๋ฌผ๋ก  ๊ทธ ๋‚ด๋ถ€ํ•จ์ˆ˜๊นŒ์ง€ ์ „์—ญ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

function foo() {
  console.log(this); // this๋Š” window
  function bar() {
    console.log(this); // this๋Š” window
  }
  bar();
}
foo();

(2) ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜

๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜ ์—ญ์‹œ this๋Š” ์ „์—ญ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™€๏ธ ๋ฉ”์†Œ๋“œ๋ž€?

  • ๊ฐ์ฒด๋Š” ํ‚ค(key)์™€ ๊ฐ’(value)์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ(property)์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ์ด ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์˜ฌ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฉ”์†Œ๋“œ(method)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
let value = 1;

let obj = {
  value: 100,
  foo: function() {
    console.log(this);  // this๋Š” obj
    console.log(this.value); // this.value๋Š” 100
    function bar() {
      console.log(this); // this๋Š” window
      console.log(this.value); // this.value๋Š” 1
    }
    bar();
  }
};

obj.foo();

(3) ์ฝœ๋ฐฑํ•จ์ˆ˜

์ฝœ๋ฐฑํ•จ์ˆ˜๋„ this๋Š” ์ „์—ญ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™€๏ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ž€?
๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์„œ ์ด์šฉ๋˜๋Š” ํ•จ์ˆ˜

let value = 1;

let obj = {
  value: 100,
  foo: function() {
    setTimeout(function() { // ์ฝœ๋ฐฑํ•จ์ˆ˜
      console.log(this);  // this๋Š” window
      console.log(this.value); // this.value๋Š” 1
    }, 100);
  }
};

obj.foo();

(4) ๋‚ด๋ถ€ํ•จ์ˆ˜์˜ this๊ฐ€ ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ์™ธ๋ถ€ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” this๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ณ , ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๊ธฐ
  2. JavaScript๊ฐ€ ์ œ๊ณตํ•˜๋Š” apply, call๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ
let value = 1;

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

    console.log(this);  // obj
    console.log(this.value); // 100
    function bar() {
      console.log(this); // window
      console.log(this.value); // 1

      console.log(that); // obj
      console.log(that.value); // 100
    }
    bar();
  }
};

obj.foo();



2. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ


(1) ์ผ๋ฐ˜

๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์†Œ์œ ํ•œ ๊ฐ์ฒด, ์ฆ‰ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

let obj1 = {
  name: 'Lee',
  sayName: function() { // ๋ฉ”์†Œ๋“œ
    console.log(this.name); // this === obj1
  }
}

let obj2 = {
  name: 'Kim'
}

obj2.sayName = obj1.sayName; 
// obj2์— sayName ์ƒ์„ฑ
// let obj2 = {
//   name: 'Kim',
//   sayName: function() {
//     console.log(this.name); // this === obj2
//   }
// }

obj1.sayName(); // Lee
obj2.sayName(); // Kim


(2) ์ผ๋ฐ˜ ๋ณ€ํ˜•

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์ธ์ง€ ๊ทธ๋ƒฅ ํ•จ์ˆ˜์ธ์ง€์— ๋”ฐ๋ผ this๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

let obj1 = {
  sayName: function() { 
    console.log(this); 
  }
}

obj1.sayName(); // obj1

let newSayName = obj1.sayName;
newSayName(); // window

(3) ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์˜ this ์—ญ์‹œ ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person(name) {
  this.name = name;
}

Person.prototype.getName = function() {
  return this.name;
}

let me = new Person('Lee');
console.log(me.getName()); // Lee

Person.prototype.name = 'Kim';
console.log(Person.prototype.getName()); // Kim



3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ


(1) ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์—ญํ• 

์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์—ญํ• ์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


(2) ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฒ•

  • ๊ธฐ์กด ํ•จ์ˆ˜์— new ์—ฐ์‚ฐ์ž๋ฅผ ๋ถˆ๋Ÿฌ ํ˜ธ์ถœํ•˜๊ธฐ
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ช…์€ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•ด ์ผ๋ฐ˜ํ•จ์ˆ˜์™€ ์ƒ์„ฑ์žํ•จ์ˆ˜์˜ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•จ์ˆ˜ me๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ instance์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ ๋‚ด๋ถ€์˜ this๋Š” instance ์ž์‹ ์ด ๋œ๋‹ค.
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person(name) {
  this.name = name;
}

let me = new Person('Lee'); // new ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
console.log(me); // Person {name: "Lee"}

let you = Person('Kim'); // new ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ์•ˆํ•จ
console.log(you); // undefined



4. apply/call ํ˜ธ์ถœ


  • this ๋ฐ”์ธ๋”ฉ
    • ์•”๋ฌต์  this ๋ฐ”์ธ๋”ฉ : ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฒฐ์ •๋จ
    • ๋ช…์‹œ์  this ๋ฐ”์ธ๋”ฉ : apply/call ๋ฉ”์†Œ๋“œ
  • this๋ฅผ ์–ด๋–ค ๊ฐ์ฒด๋กœ ์ง€์ •ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋“  ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์ธ Function.prototype ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ์ด๋‹ค.

(1) apply

๐Ÿ’๐Ÿปโ€โ™€๏ธ apply

function.apply(thisArg, [argsArray])
  • thisArg : ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด
  • [argsArray] : ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  argument์˜ ๋ฐฐ์—ด
let Person = function (name1, name2) {
  this.name1 = name1;
	this.name2 = name2;
};

let foo = {};

Person.apply(foo, ['name1', 'name2']);

console.log(foo); // { name1: 'name1'; name2: 'name2' }

๐Ÿš€ ์‹คํ–‰ ๊ณผ์ •
1. apply()๋ฅผ ํ†ตํ•ด Person ํ˜ธ์ถœ
- apply()๋Š” this๋ฅผ ํŠน์ • ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•  ๋ฟ์ด๋‹ค.
- ๋ณธ์งˆ์ ์ธ ๊ธฐ๋Šฅ์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ!
2. this์— ๊ฐ์ฒด foo๋ฅผ ๋ฐ”์ธ๋”ฉํ•จ
3. Person ํ•จ์ˆ˜์˜ this๋Š” foo ๊ฐ์ฒด๊ฐ€ ๋จ
4. Person ํ•จ์ˆ˜์˜ this์— ๋ฐ”์ธ๋”ฉ๋œ foo ๊ฐ์ฒด์— name ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๊ฐ’์ด ํ• ๋‹น๋จ


(2) call

๐Ÿ’๐Ÿปโ€โ™€๏ธ call
apply์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์œผ๋กœ, ๊ทธ ๋ชจ์–‘๋งŒ ๋‹ค๋ฅด๋‹ค.

Person.apply(foo, ['name1', 'name2']);
Person.call(foo, 'name1', 'name2');
let Person = function (name1, name2) {
  this.name1 = name1;
	this.name2 = name2;
};

let foo = {};

Person.call(foo, 'name1', 'name2');

console.log(foo); // { name1: 'name1'; name2: 'name2' }



์ •๋ฆฌ


๐Ÿ’๐Ÿปโ€โ™€๏ธ this์˜ ์šฉ๋ฒ•์„ ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์‹คํ–‰์ปจํ…์ŠคํŠธ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.
  • this๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ฒฐ์ •๋œ๋‹ค.
  • ๊ทธ ์ด์œ ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํฌ๊ฒŒ 4๊ฐ€์ง€์ด๋ฉฐ, ์ด๋•Œ๋งˆ๋‹ค this๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฐ์ฒด๋Š” ๋‹ค๋ฅด๋‹ค.
    1. ์ „์—ญ๋ฒ”์œ„์—์„œ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ (window)
    2. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ (๋ฉ”์†Œ๋“œ๊ฐ€ ์†ํ•œ ๊ฐ์ฒด)
    3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ (์ธ์Šคํ„ด์Šค)
    4. apply / call ํ˜ธ์ถœ (this๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด ์„ค์ •)



์ฐธ๊ณ 


์ด ๊ธ€์€ ์•„๋ž˜์˜ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณต๋ถ€ํ•˜๋ฉฐ ๊ฐœ์ธ์ ์œผ๋กœ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ถœ์ฒ˜๋Š” ๋ชจ๋‘ ์•„๋ž˜์— ์žˆ๋Š” ํฌ์ŠคํŒ…์— ์žˆ์Šต๋‹ˆ๋‹ค.

profile
FE Developer

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