๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Javascript

Javascript This

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

์•„๋ž˜ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ–ˆ๋А๋ƒ์— ๋”ฐ๋ผ this๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

var student = {
  name: "jennie",
  myName: function () {
    console.log(this.name);
  },
};

var myName = student.myName;
myName(); // undefined
student.myName(); // jennie

๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ๋Š” myName()์€ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ์„ ํ–ˆ๊ณ  student.myName()๋Š” ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ

๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค

  • ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ฃผ์ฒด๋Š” ์ „์—ญ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์ „์—ญ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค.
  • a์™€ window.a๋Š” ๊ฐ™๊ณ , foo();์™€ window.foo();์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์•”์‹œ์ ์œผ๋กœ window์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
var a = "Hello?";

function foo() {
  console.log("world");
}

console.log(a); // Hello?
console.log(window.a); // Hello?

foo(); // world
window.foo(); // world

์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ์‹œ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค

์•„๋ž˜ ์†Œ์Šค์™€ ๊ฐ™์ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ์‹œ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.(๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window, ๋…ธ๋“œ์—์„œ๋Š” global)

function foo() {
  function a() {
    console.log(this); // window
  }
  a(); // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
}

foo();
var obj = {
  foo: function () {
    function f() {
      console.log(this); //window
    }
    f();  // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  },
};

obj.foo();

use strict ๋ชจ๋“œ์ผ ๋•Œ

์˜ค๋ฅ˜๋ฅผ ๋ณด์•ˆํ•ด ์ฃผ๊ธฐ ์œ„ํ•ด ์—„๊ฒฉํ•œ ์ฝ”๋“œ ์‹คํ–‰์„ ํ•ด์ฃผ๋Š” ํ™˜๊ฒฝ

"use strict";

var a = "hello";

function foo() {
  console.log(this.a); // this === undefined
}

foo();
  • ์œ„ ์†Œ์Šค์™€ ๊ฐ™์ด use strict ๋ชจ๋“œ๊ฐ€ ์ ์šฉ๋˜๋ฉด this === undefined๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ window๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด window๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
"use strict";

var a = "hello";

function foo() {
  console.log(window.a); // hello
}

foo();

Method ํ˜ธ์ถœ ์‹œ

  • ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด์˜ ์†Œ์†์ธ ๋ฉ”์†Œ๋“œ์˜ this๋Š” ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
var a = "hello";

var obj = {
  a: "world",
  foo: function foo() {
    console.log(this.a); // world
  },
};

obj.foo(); // this๋Š” obj๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
var a = {
  name: "a",
  b: {
    name: "b",
    foo: function () {
      console.log(this.name); // b
    },
  },
};

a.b.foo(); // this๋Š” a.b๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ์˜ this ์šฐํšŒ๋ฒ•

var name = "lisa";

var obj = {
  name: "jennie",
  getName: function () {
    console.log(this.name); // jennie (this === obj)

    function getThisName() {
      console.log(this.name); // lisa (this === window)
    }
    getThisName();
  },
};

obj.getName();

์œ„ ์†Œ์Šค์—์„œ getThisName์˜ this๋ฅผ obj๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก(this === obj) ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋ณ€์ˆ˜์— this๋ฅผ ๋‹ด๋Š” ๋ฐฉ๋ฒ•

  • ๋ณ€์ˆ˜์— this๋ฅผ ๋‹ด์•„ obj๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var name = "lisa";

var obj = {
  name: "jennie",
  getName: function () {
    const newThis = this;

    function getThisName() {
      console.log(newThis.name); // jennie
    }
    getThisName();
  },
};

obj.getName();

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—๋Š” this๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์Šค์ฝ”ํ”„ ์ฒด์ด๋‹ ์ƒ์˜ this์— ์ ‘๊ทผํ•˜์—ฌ obj๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
var name = "lisa";

var obj = {
  name: "jennie",
  getName: function () {
    console.log(this.name); // jennie

    var getThisName = () => {
      console.log(this.name); // jennie
    };
    getThisName();
  },
};

obj.getName();

์ฝœ๋ฐฑ ํ˜ธ์ถœ ์‹œ - ๋ช…์‹œ์  this ๋ฐ”์ธ๋”ฉ

call

func.call(thisArg[, arg1[, arg2[, ...]]])

var callback = function () {
  console.log(this); // window
};

var obj = {
  foo: function (cb) {
    cb();
  },
};

obj.foo(callback);

this๋ฅผ obj๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด call์„ ์‚ฌ์šฉํ•˜์—ฌ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var callback = function () {
  console.log(this); // obj
};

var obj = {
  foo: function (cb) {
    cb.call(this);
  },
};

obj.foo(callback);

call์˜ ๊ฒฝ์šฐ arg ์ธ์ž์˜ ์ˆ˜๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

var string = "hello";

function foo(a, b, c, d, e) {
  console.log(this.str);
  console.log(arguments);
}

var obj = {
  str: "world",
};

foo.call(obj, 1, 2, 3, 4, 5);

apply

func.apply(thisArg, [argsArray])

var string = "hello";

function foo(a, b, c, d, e) {
  console.log(this.str);
  console.log(arguments);
}

var obj = {
  str: "world",
};

foo.apply(obj, [1, 2, 3, 4, 5]);
  • ์ธ์ž๋ฅผ 2๊ฐœ๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ๋Š” this๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์ธ์ž๋Š” ๋ฐฐ์—ด๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

bind

this๊ฐ’์„ ์„ค์ •ํ•ด ๋†“์€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

func.bind(thisArg[, arg1[, arg2[, ...]]])

var callback = function () {
  console.log(this); // obj
};

var obj = {
  foo: function (cb) {
    cb.call(this);
  },
};

setTimeout(callback, 1000);

์œ„์™€ ๊ฐ™์ด setTimeout์— ์ฝœ๋ฐฑ์„ ๋‹ด์•„ ๋„˜๊ธฐ๋ฉด this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
this๋ฅผ obj๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด bind๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var callback = function () {
  console.log(this); // obj
};

var obj = {
  foo: function (cb) {
    cb.call(this);
  },
};

setTimeout(callback.bind(obj), 1000);

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

new ์—ฐ์‚ฐ์ž๋ฅผ ์ผ์„ ๋•Œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์Šคํ„ดํŠธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ช…๋ น์œผ๋กœ ์ƒˆ๋กœ ๋งŒ๋“ค ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด ์ž์ฒด๊ฐ€ this๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ์ž(constructor)๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜(class)์ž…๋‹ˆ๋‹ค..
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ฒซ ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ ์•ž์— new๋ฅผ ๋ถ™์ด๋ฉด ๋ฆฌํ„ด ๊ฐ’์€ ๊ฐ์ฒด(instance)๊ฐ€ ๋œ๋‹ค.
function Foo() {
  console.log(this); // {}
}

new Foo(); // ๊ฐ์ฒด instance

new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ์•ˆ์˜ this์˜ ๊ฐ’์€ ๋นˆ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜์–ด์„œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

function Foo() {
  this.name = "sara";
}

const a = new Foo();

์œ„ ์†Œ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด this๋ฅผ return ํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function Foo() {
  this.name = "sara";
  /*
    {
      name: 'sara';
    }
    return this;
  */
}

var a = new Foo();
var name = "sara";
var age = 30;

function Person(name, age) {
  this.name = name;
  this.age = age;
}

const lisa = Person("lisa", 20);

console.log(window.name, window.age); // lisa, 20

์œ„ ์†Œ์Šค์ฒ˜๋Ÿผ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ  ์ „์—ญ ๊ฐ์ฒด์˜ name, age์˜ ๊ฐ’์€ ์žฌํ• ๋‹น ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

var name = "sara";
var age = 30;

function Person(name, age) {
  this.name = name;
  this.age = age;
}

var lisa = new Person("lisa", 20);

console.log(window.name, window.age); // sara, 30
console.log(lisa);

new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉด์„œ ๊ทธ ๊ฐ์ฒด ์•ˆ์— name, age ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ lisa๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

'Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Class ํด๋ž˜์Šค  (0) 2022.12.23
๊ฐ์ฒด ์ง€ํ–ฅ Prototype  (0) 2022.12.04
์‹คํ–‰ ์ปจํ…์ŠคํŠธ  (0) 2022.11.13
๋ฐ์ดํ„ฐ ํƒ€์ž…(์›์‹œํ˜• vs ์ฐธ์กฐํ˜•)  (0) 2022.11.01