Web/Frontend

[JS] 객체리터럴, this, bind()

WakaraNai 2021. 7. 1. 16:11
728x90
반응형

객체 정의

var healthObj = {
  name : "달리기",
  lastTime : "PM10:12",
  showHealth : function() {
    console.log(this.name + "님, 오늘은 " + this.lastTime + "에 운동을 하셨네요");
  }
}

healthObj.showHealth();

 

 

 

this

객체 안에서의 this는 그 객체 자신을 가리킴

ES6부터 객체에서 메소드를 사용할 때 function 생략 가능

const obj = {
   getName() {
     return this.name;
     },
  setName(name) {
      this.name = name;
    }
}
obj.setName("crong");
const result = obj.getName();

 

 

함수가 실행될 때, 함수에서 가리키는 this 키워드를 출력하면

프로그램이 현재 가리키고 있는 객체를 알 수 있음

function get() {
    return this;
}

get(); //window. 함수가 실행될때의 컨텍스트는 window를 참조한다.
new get(); //object. new키워드를 쓰면 새로운 object context가 생성된다.

 

비동기적으로 실행되는 함수에서는,

프로그램이 대상인 객체를 가리키지 않고 있을 수 있음

아래의 setTimeout() 속 this는 그 당시에 healthObj를 가리키지 않고

window를 가리키고 있기 때문에 존재하지 않는 변수라며 에러 발생

var healthObj = {
  name : "달리기",
  lastTime : "PM10:12",
  showHealth : function() {
    setTimeout(function() {  // setTimeout( () => {
    	//debugger
        console.log(this.name + "님, 오늘은 " + this.lastTime + "에 운동을 하셨네요");      
    }, 1000)
  }
}
healthObj.showHealth();

 

 

 

bind

새로운 함수를 반환하는 함수

첫번째 인자로 this를 주어, 그 시점의 this를 기억하는 새로운 함수가 반환됨

this가 가리키는 대상을 바꿔줌

 

해당 내용이 실행될 때의 this를 가리키지 않고,

처음 시작할 때 가리키던 this를 그대로 가지고 갈 수 있도록 바인드 해줌

var healthObj = {
  name : "달리기",
  lastTime : "PM10:12",
  showHealth : function() {
    setTimeout(function() {
        console.log(this.name + "님, 오늘은 " + this.lastTime + "에 운동을 하셨네요");      
    }.bind(this), 1000)
  }
}
healthObj.showHealth();

 

728x90
반응형

'Web > Frontend' 카테고리의 다른 글

handlebar를 활용한 템플릿 작업  (0) 2021.07.06
jQuery 프레임워크에 대해  (0) 2021.07.01
[JS] 배열 메소드  (0) 2021.07.01
HTML Templating  (0) 2021.06.11
Tab UI Component  (0) 2021.06.11