ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JavaScript] call, apply, bind
    Programming/Web 2020. 4. 1. 21:47

    call

    func.call( this, arg1, arg2,... )

     

    call 메서드는 모든 함수에서 사용할 수 있으며 this를 특정값으로 지정할 수 있다.

     

    - this : 지정 객체

    - arg1, arg2 : 객체를 위한 인수

     

    apply

    func( this, [ argsArray ] )

     

    apply 메서드는 call의 역할과 완전히 같지만, 인수를 배열로 전달한다.

     

    - this : 지정 객체

    - [argsArray] : 객체를 위한 인수 배열

     

    bind

    func.bind( this, arg1, arg2,... )

     

    bind 메서드는 함수의 this 값을 영구히 바꿀 수 있다. bind 메서드를 호출하면 this를 받으면서 새 함수를 리턴한다.

     

    - this : 지정 객체

    - arg1, arg2 : 객체를 위한 인수

     

     

    bind, 언제 사용하나요?

    setTimeout에 메서드를 전달할 때 처럼, 객체 메서드를 콜백으로 전달할 때 this 정보가 사라지는 문제가 생긴다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var healthObj = {
      name : "달리기",
      lastTime : "PM10:12",
      showHealth : function() {
        setTimeout(function() {
            console.log(this.name + "님, 오늘은 " + this.lastTime + "에 운동을 하셨네요");      
        }, 1000)
      }
    }
    healthObj.showHealth();
    cs

     

    위 예시의 실행결과는 `undefined`가 되는데 그 이유는 setTimeout 메서드에서 this에 window를 할당하기 때문이다.

    따라서 this.name은 window.name이 되는데 window에는 name과 lastTime이 없으므로 undefined가 출력된다.

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    healthObj.showHealth();var healthObj = {
      name : "달리기",
      lastTime : "PM10:12",
      showHealth : function() {
        setTimeout(function() {
            console.log(this.name + "님, 오늘은 " + this.lastTime + "에 운동을 하셨네요");      
        }.bind(this), 1000)
      }
    }
    healthObj.showHealth();
    cs

     

    이때 bind 메서드를 사용하면 컨텍스트를 고정하여 setTimeout에 넘길 수 있다.

     

     

    +)

    또 다른 방법으로는 익명 함수를 사용하는 방법도 있지만 setTimeout이 트리거 되기 전에 context가 변경되는 경우에는 의도와 다른 결과를 초래할 수 있다.

     

     

     

    출처

    - https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

    - https://ko.javascript.info/bind

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

    [Spring Boot] spring jar 파일 생성  (0) 2021.03.26
    [Web] SPA(Single Page Application)  (0) 2020.04.02
    [Web] Ajax 시작하기  (0) 2020.03.23
    [Web] Accept와 Content-type  (0) 2020.03.18
    [Web] CGI, Servlet, JSP  (0) 2020.03.06

    댓글

Designed by Tistory.