레벨업
this와 바인딩
kims1997
2022. 12. 22. 10:17
반응형
this와 바인딩
This
this는 원래 자기 자신을 가리키는 참조변수다
자바스크립트에서 this는 함수호출 방식에 따라 this가 결졍된다ㅏ
함수호출방식과 this
자바스크립트는 함수 호출시 어떻게 호출되는가에 따라서 동적으로 this가 결정
- 함수 호출시 this: window
- 메소드 호출시 this: 메소드 객체
- 내부함수 호출시 this: window
- 엄격모드에서의 this: undefined
- 이벤트 리스너 호출시 this : 이벤트 객체
- 생성자 함수 호출시 this : 생성된 새 객체
함수 호출시 this
자바스크립트에서 함수를 호출하면 해당 함수 내부 코드에서 사용된 this는전역객체 에 바인딩한다
즉, 함수는 전역객체의 메소드이다 따라서 메소드 호출시와 동일하게 메소드 객체 를 this로 갖는다
메소드 호출시 this
객체의 메소드를 호출할 때는 해당 메소드를 호출한 객체로 바인딩된다
프로토타입 객체도 메소드를 가진다 프로토타입 객체도 일반적인 메소드이 this 바인딩 규칙을 따른다
내부함수 호출시 this
내부 함수도 함수 호출시 this 바인딩 규약을 따른다 즉 this 는 전역객체에 바인딩된다
- 일반함수,메소드 ,콜백함수 관계 없이 해당 함수 내에 내부 함수는 전역객체에 바인딩
- apply,call,brind 메소드를 통해서 this 를 바인딩해서 사용
엄격모드에서의 this
엄격모드는 코드 안정성과 오류 검증을 위해서 나온 것으로 ECMA 5.1버전에서 나왔다
- 엄격 모드에서 함수 실행시 this는 undefined가 된다
- 내부 함수 호출시 this 또힌 undefined가 된다
- 의도치 않게 전역객체에 바인딩된 this를 사용히는 것을 막을 수 있다
이벤트리스너 호출시 this
이벤트 리스너나 setTimeout 등에 객체의 메소드를 콜백함수로 등록할 때 어떤 규약을 따를까
객체로 부터 메소드가 분리 되었을 때 this 는 메소드가 정의된 객체가 아니다
setTimeout 에 객체의 메소드를 전달하면 매개변수로 전달되었기 때문에 매소드는 객체로 부터 분리되어 있다 함수로서 실행이 된다
따라서 this 전역객체 이다
엄격모드에서는 undefined가 된다
생성자 함수 호출시 this
- 자바스크립트 생성자 함수는 말그대로 객체를 생성한다.
- 다른 객체지향 언어의 생성자 함수와 달리 형식은 정해저있지 않고 기존 함수에 new를 붙여서 호출하면 생성자 함수로 동작한다.
- 다만 특정 함수가 생성자 함수로 정의되어 있음을 알리려고 첫 글자를 대문자로 하는 것을 권하고 있다.
반응형