function square(number) {
console.log(arguments);
console.log(this);
return number * number;
}
square(2);
- 함수 호출
- 메소드 호출
- 생성자 함수 호출
- apply/call/bind 호출
- 이벤트리스너나 제이쿼리
1) call : 두번째 인자부터 값 형태로 연결 및 실행
2) apply : 두번째 인자를 배열 형태로 연결 및 실행
3) bind : this가 바인딩된 새로운 함수를 리턴
<body>
<button id="app">abC</button>
<script>
function outer(){
console.log('outer ' ,this);
}
document.querySelector('#app').addEventListener('click', function() {
console.log('addEvent ', this); // <div>
const innerArrow = () => {
outer();
console.log('innerArrow ', this); // inner <div>
const inner = () => {
console.log('innerArrow inner ', this);
}
inner();
}
function innerFunc(){
outer();
console.log('innerFunc ', this)
const inner = () => {
console.log('innerFunc inner ', this);
}
inner();
}
innerArrow();
innerFunc();
});
</script>
</body>
addEvent : 내부적으로 이벤트 핸들러는 this가 해당 태그 대상으로 바뀌어서 button태그
outer : 전역컨텍스트안의 this로 window객체를 나타냄
innerArrow : 화살표 함수는 this로 window 대신 상위 함수의 this를 가져오므로 해당 부분의 상위는 this가 해당 태그 대상으로 바뀐 button태그
innerArrow inner : 해당 상위 this를 찾아가는데 상위도 화살표함수이므로 다시 그 상위인 해당 태그 대상으로 바뀐 button태그
outer : 전역컨텍스트안의 this로 window객체를 나타냄
innerFunc : 내부일반함수이므로 window 객체를 나타냄
innerFunc inner : 화살표함수이므로 해당 상위 this를 찾아가는데 상위는 내부일반함수이므로 window 객체를 나타냄
함수는 호출될때 함수의 종류에 따라 this가 달라진다.
이때 달라지는 this를 상위의 this로 고정하는 방법은 화살표함수를 사용하는 것이다. (상위 또한 화살표 함수이면 그 다음 상위 함수의 this를 참조한다)