this가 객체를 가리킨다 하지만, 어떤 객체를 가리키는지는 this를 사용하는 해당 함수를 “어떤 방식으로 호출하느냐” 에 따라 결정된다.
1 | var name = "bow-wow"; |
this 를 사용하는 해당 함수를 호출하는 방식에는 4가지가 있다.
1. Regular function call - 일반 함수 실행 방식
1-1. in non-strict mode
non-strict mode 에서 일반 함수 실행방식으로 this 를 사용한 함수를 호출했을 경우에 this 를 global object를 가리킨다.
1 | var name = "ken"; |
1-2. in strict mode (찾아보고 공부하기)
1 | ; |
2. Dot Notation - 점 호출 방식
Dot notation 방식으로 this 를 사용한 함수를 호출했을 경우에 this 는 점 앞부분의 객체를 가리킨다.
1 | var age = 100; |
ken.foo() 가 Dot notation방식으로 실행되었음으로 this.age 의 this 는 ken 객체를 가리킨다. 따라서 console.log 값은 35가 나온다.
3. Explicit binding - 분명하게 this를 지정하는 방식
Function.prototype.call, Function.prototype.bind, Function.prototype.apply
3-1. call, apply
1 | var age = 100; |
1 | var age = 100; |
!! call과 apply 차이점은 면접 질문으로 자주 출제
1 | function.call(thisArg, arg1, arg2, ...) //thisArg는 필수요소 |
call과 apply는 모두 this 값을 명시해주는 인자를 첫 번째 인자로 가지며 return 값도 this 가 지정된 함수를 호출하는 것으로 동일하다. 하지만, 이 둘의 차이점은 call은 “많은 인자”를 가질 수 있지만, apply는 “최대 2개의 인자”를 갖을 수 있고 “두 번째 인자는 배열”이여야 한다는 것이다.
3-2. bind
공부 중/
4. ‘new’ keyword 를 사용해서 실행한 함수
1 | function Person() { |
new 연산자를 사용하면 빈 객체가 생기고, this 는 이 객체를 가리킨다.
틀린 예제 정리
예제1.
1 | var age = 100; |
1-1. 정답
butler.serve 에서 something.speak 를 일반함수 호출방식으로 cd() 호출하고 있음으로 this 는 global object 를 가리키므로 답은 100 이다.
1-2. 나의 오답 이유
내가 헷갈렸던 부분은 butler.seve 의 인자 부분에 대한 해석이었다. something.speak 를 Dot Notation 방식으로 호출하려 한다면 something.speak() 가 올바르다. something.speak 는 속성에 대한 값을 나타낸다.
예제2.
1 | function programmer() { |
2-1. 정답
work 함수안의 this 가 어떤 객체를 가리키고 있는 지 묻는 문제이다. work() 는 일반함수 호출방식으로 실행되었음으로 work 함수안의 this 는 global object를 가리킨다. 글로벌 객체에 isSmart 라는 속성은 정의되지 않았음으로, window.alert 는 실행되지 않는다.
programmer.upgrade의 키 값인 함수가 ‘1.1’를 인자를 갖고 실행된다.upgrade함수안의this는programmer를 가리킨다.programmer의 속성isSmart에!!1.1인true를 할당한다. (!!version은 값을 불리언값으로 바꿔주는 역할)work함수를 일반호출 방식으로 실행한다.work함수안의this는 글로벌 객체를 가리킴으로if조건문을 만족 하지않아alert메서드는 실행되지 않는다.