자바스크립트 this, bind

 자바스크립트 this, bind




this

상황에 따라 어떠한 객체를 가리키는 키워드이고, this는 함수를 호출한 객체입니다.

보통 함수를 호출 할 때에 aTest()라고 호출을 하지만 전역객체를 쓰지 않아도 가능해서 이렇게 쓸 수 있습니다. 전역객체에서 접근하려면 window.aTest()라고 호출합니다.

하지만 코드 상단에 'use strict'를 입력하면 window.aTest()라고 입력해주어야합니다.


"use strict";
function aTest() {}

window.aTest();

함수를 정의하게 되면 이 함수는 자동으로 window 객체에 등록이 됩니다.

function으로 함수를 정의하면 window객체에 등록이 되지만 화살표함수는 window객체에 등록이 되지 않습니다.


function aTest() {}

const aaTest = () => {};

console.log(window);

그래서 함수를 호출한 객체라고 부릅니다.


function aTest() {
  console.log(this); // window
}

aTest();

aTest 함수안에서 this를 찍어보면 함수를 호출한 객체를 가르키고 있습니다.

객체(Object)에서의 this


const object = {
  name: "kim",
  age: 30,
  main: function () {
    console.log(this); //name: 'kim', age: 30, main: f
  },
};

object.main();


this는 함수를 호출한 객체를 가르키기 때문에 object안에 있는 내용들을 출력합니다.

이 this를 이용해서 객체에 있는 속성에 접근 할 수 있습니다.


const object = {
  name: "kim",
  age: 30,
  main: function () {
    console.log(this.name); // kim
  },
};

object.main();


만약 main 함수를 다른 변수에 넣고 호출한다면 


const object = {
  name: "kim",
  age: 30,
  main: function () {
    console.log(this); // window
  },
};

const main2 = object.main;
main2();

main2는 window를 가리키게 됩니다. main2는 어떠한 객체에도 속하지 않기 때문에 전역객체인 window를 가리킵니다.

함수는 꼭 객체 안에서 만들 필요는 없습니다.


function main() {
  console.log(this); // name: 'kim', age: 30, main: f
}

const object = {
  name: "kim",
  age: 30,
  main,
// es6문법에서는 속성명(key)과 값(value)의 이름이 같으면 값 생략가능
};

object.main();

함수를 먼저 생성하고 object에 구성원으로 추가를 해주어도 this는 object를 가리킵니다.

또는


function main() {
  console.log(this); // name: 'kim', age: 30, main: f
}

const object = {
  name: "kim",
  age: 30,
};
object.main = main;

object.main();

object 객체에 접근해서 main 속성을 추가해 main 함수를 넣어서 추가 할 수도 있습니다.

이벤트처리에서의 this

html 파일에서 button을 만들고 id를 button으로 주고 이벤트 안에서 this를 알아보겠습니다.


let btn = document.getElementById("button");

btn.addEventListener("click", function () {
  console.log(this); // <button id = 'button'>버튼</button>
});

이벤트안에서의 this는 이벤트를 발생시킨 돔요소를 가리킵니다.


bind

bind는 함수처럼 호출 가능한 새로운 함수로 특수객체를 반환합니다.

첫번째 인자는 this키워드를 가리키는 객체이고 두번째 인자부터는 바인드된 함수의 인수로 제공 됩니다.

이 객체를 호출 하면 this를 원하는 형태로 묶어서 고정된 함수로 반환합니다.

함수를 누가 호출 하든, 어떻게 호출하든 상관없이 this값이 바뀌지 않도록 내가 원하는 객체로 고정하고 싶을 때 사용합니다.


let user = {
  name: "kim",
  age: 30,
};

function main() {
  console.log(this);
}

const mainBind = main.bind(user); // {name: 'kim', age: 30}

mainBind();

bind 메서드를 쓰지 않으면 어떠한 객체에도 속하지 않은 함수의 this는 전역객체인 window를 가리키지만 bind 메서드를 쓰면 내가 원하는 객체를 가리킬 수 있습니다.

bind 메서드를 쓰면 bind된 함수를 object에 추가를 해도 내가 지정한 객체만을 가리킵니다.

이것 말고도 인수를 고정해서 사용할 수도 있습니다.


function cal(a, b) {
  console.log(a + b); //7
  console.log("a", a); // 2
  console.log("b", b); // 5
}

let num = cal.bind(null, 2);

num(5);

bind의 첫번째 인자는 항상 실행컨텍스트를 넘겨줘야 하지만 여기서는 넘겨줄 객체가 없으므로 null을 주고 a의 값을 고정시켰습니다.

주의할 점은 이미 bind된 함수는 또 bind를 할 수 없습니다. bind된 함수를 또 bind를 한다해도 처음에 내가 지정한 객체만을 가리킵니다.

댓글

이 블로그의 인기 게시물

[정보처리기사] OSI 7계층 정리

블로그스팟 상위노출 시작하기

데이터베이스 데이터 정의어(DDL), 자료형(데이터 타입)