본문 바로가기
갬발자의 프로그래밍/Javascript

this의 참조

by 코라제이 2019. 12. 24.

실행 콘텍스트의 this 바인딩 컴포넌트에 바인딩되어 객체를 참조 

console.log(foo() === window.foo()); //true

 

기본적으로 this는 전역 객체를 참조한다. 

 

만약 어떠한 객체를 참조하고 있다면 this는 그 객체를 참조하게 된다.

 

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

foo()// window

const obj = { foo: foo };

obj.foo() // obj

 

또한 this는 객체 속성의 내부함수로 this가 있다면 그 this는 window를 가리키게 된다. 

콜백 함수의 this도 window 객체를 가리킨다.

 

내부 함수

const obj = {
    foo: function(){
        console.log(this); // obj
        function innerfoo(){
            console.log(this); //window
        }
        innerfoo();
    }
}

obj.foo();

 

콜백

 

const obj = {
    cb: function(){
       setTimeout(function(){
           console.log(this); //window
      }, 1000);
    }
}

obj.cb();

 

실행 콘텍스트가 실행문을 만나면 그때 메모리에 할당이 되기 때문이다. 

 

이것을 참조시키기 위해서 call, apply, bind ( 이 메서드들은 함수 객체가 가지고 있다)가 있으며

es6에서 arrow로써 해결할 수 있다.

 

내부 함수

const obj = {
 ...
     (() => {
     console.log(this); //obj
     })()
     innerfoo.call(this); //obj
     innerfoo.apply(this); //obj
     innerfoo.bind(this)(); //obj
   }
}

obj.foo();

콜백

const obj = {
    cb: function(){
       setTimeout(function(){
           console.log(this); //obj
      }.call(this), 1000);
    }
}

obj.cb();

 

es6의 화살표 함수의 this 참조는 객체를 참조하는 this의 차이가 있다.

 

const name =1

const foo = {
    name: 'foo',
    a: function(){
        function windowName(){
            console.log(this.name) //1
        }

        windowName();
        fooName=()=> console.log(this.name); // foo
        fooName()
    }
}

foo.a();

 

위와 같이 출력하게 된다면 windowName()는 1을 출력하게 된다.  이는 this가 호출될 때 정의되는데 참조할 대상이 없기 때문에 window객체를 참조하는 것이다. (내부 함수)

 

화살표 함수로 표현된 fooName()의 this는 함수를 정의할 때 결정된다. 그렇기 때문에 바로 foo객체를 this 참조하게 된다. 

 

this를 명시적 참조가 필요한 경우  bind(), call(), apply() 함수를 사용할 수 있다.

 

세 개가 비슷하며 this 참조를 바인딩해준다.

 

화살표 함수는 call이나 apply 메서드를 사용하여도 this값은 바뀌지 않는다.

 

const user = { name : 'a' , age : 18 };

const callName=()=>{
  return this.name;
}
console.log(callName.bind(user)()); //""
console.log(callName.call(user)); //""
console.log(callName.apply(user)); //""

'갬발자의 프로그래밍 > Javascript' 카테고리의 다른 글

개념과 특징  (0) 2020.01.05
즉시실행함수, Closure  (0) 2019.12.24
prototype  (0) 2019.12.23
Execution Context  (0) 2019.12.23
Argument 처리 형태  (0) 2019.12.22

댓글