this
#
this현재 실행 문맥
을 가리킴
- 실행 문맥은 함수
호출
방법에 의해 결정된다.
#
런타임에 결정되는 this 의 장단점장점
함수(메서드)
를 하나만 만들어여러 객체
에서재사용
할 수 있다.
단점
- this 의 유연함이 실수로 이어질 수 있다.
#
전역 문맥엄격 모드 여부에 관계없이 전역 객체를 참조한다.
#
함수 문맥함수 내부에서 this 는 함수 호출 방법에 결정된다.
#
함수 단순 호출#
비엄격모드#
엄격모드즉 함수를 객체의 메서드나 속성(window.f2())이 아닌 직접 호출했기 때문에 undefined
이다.
#
call(), apply()this 의 대상 변경
, this 값을 한 문맥에서 다른 문맥으로 넘길때 사용한다.
첫 번째 인자
로객체
가 전달 될 수 있으며this 가 그 객체에 묶임
.
#
함수호출 인수- call 의 두번째 인수 부터
이어지는 인자
- apply 의
두 번째 배열 인자
비엄격 모드
에서 this
로 전달된 값이 객체가 아닌 경우
, call apply 는 이를 객체로 변환
합니다.
null
undefined
값은전역 객체
가 된다.원시 값
은 관련생성자
를 사용해객체로 변환
된다.
#
bind 메서드Function.prototype.bind
- f.bind(someObject) 호출하면 this 는
원본 함수를 가진 새로운 함수를 생성
한다. 새 함수의 this
는호출방식과 상관없이 영구적인 bind()의 첫번째 매개변수로 고정
된다. 즉, bind 는한번만 동작
한다.
#
함수 빌림함수는 객체를 바탕으로 작동한다.
빌릴함수.call(현재 객체)
#
함수.arguments유사 배열이므로 배열 메서드를 사용할 수 없다.
대신
Array.prototype.join.call(arguments))
처럼 배열 메서드를 빌려쓸 수 있다.
#
프로퍼티 빌림자식 생성자 안에서 부모생성자의 프로퍼티를 가져오는것.
부모 생성자의 프로퍼티 실행 부모생성자.call(this, 부모 프로퍼티)
- 부모 생성자를 호출하는 동시에 객체를 자식 생성자의 객체의 this 로 설정
#
화살표 함수화살표 함수에서 this 는 자신을 감싼 정적 범위(lexical context)
이며, (생성시점)
전역 코드에서는 전역 객체를 가리킨다.
화살표 함수를 call, bind, apply
를 사용해 호출해도 무시
된다.
this 를 반환하는 화살표 메서드 bar
로 갖는 obj 객체
.
obj.bar 에 할당된 익명함수 A
와, 화살표 함수로 생성된 익명함수 B
가 있다면
B 함수가 호출될 때
B의 this 는 영구적으로 함수 A의 this 로 설정
된다.
bar() 의 this 는 obj
호출 없이 obj 메소드 참조
화살표 함수의 this 를 bar 메서드 내부에서 호출하면 fn2의 this 를 따르므로 window 를 반환한다.
#
객체의 메서드로서 함수익명함수는 o 객체의 프로퍼티에 할당된 메서드
객체의 메서드로 함수를 호출
하면 함수의 this 값은 그 객체
를 사용한다.
가장 즉각적인 멤버 대상의 영향을 받는다
. 실행동안 this 는 o.b 이다. o.b 의 prop 은 42.
#
객체의 프로토타입 체인에서의 this메서드를 가짐 x, 프로토 타입으로 상속 받음 o
메서드가 어떤 객체의 프로토타입 체인 위에 존재하면, this 의 값은 그 객체가 메서드를 가진 것 마냥 설정된다.
변수 p에 할당된 객체는, f 속성을 가지고 있지 않지만, 프로토타입으로 부터 상속 받는다. p.f 를 찾아 참조하기 시작하므로, 함수 내부의 this 는 p 처럼 나타내는 객체 값을 취한다.
#
접근자와 설정자의 this함수의 접근자와 설정자 로 사용될 함수 sum 의 this
접근자 프로퍼티 설명자 get 사용된 average 함수
접근자 프로퍼티 설명자 get 으로 사용된 sum 함수
접근자 프로퍼티 설명자(get, set) 의 함수의 this
는, 접근하거나 설정하는 속성을 가진 객체로 묶인다.
#
생성자로서 함수함수를 new 키워드
와 함께 생성자
로 사용하면 this
는 새로 생긴 객체
에 묶인다.
#
생성자의 반환 값객체가 아닌 경우
에는,기본값에 의해 참조되는 객체를 반환
한다.
객체일 때
,다른 객체를 반환
할 수 있습니다.
#
DOM 이벤트 처리기로서 함수this
는 이벤트를 발사한(시작된, 유발된) 요소
로 설정된다.
addEventListener()
에서만 따르는 규칙.
TODO 'EventListener와 target에 대한 내용은 이벤트 버블링에서 다룬다.'
this 는 window 객체아 가닌 body 객체가 된다. 이벤트 발생시 내부적으로 바뀌기 때문이다. 그러나 함수의 내부 함수의 this 는 다시 window 이다. 내부 함수의 this 를 외부 함수의 this 인 body 와 같게 하려면 내부함수를 화살표함수로 표현하면 된다. 혹은 this 를 외부함수의 변수로 저장하고 내부함수에서 스코프를 사용해서 사용할 수 있다.
#
인라인 이벤트 핸들러에서 함수- 가장 바깥쪽 코드
this 는처리기를 배치한 DOM 요소
로 설정된다.
경고창은 'button' 을 보여준다.
- 내부함수 this
IIFE 으로 실행된 함수의 this 는전역/window 객체
를 반환한다.(비엄격모드)
#
객체 리터럴에서 this 사용하기this 의 값은 전체 함수가 된다. 코드 블록과 객체 리터럴은 영향을 주지 않는다.
즉, ref: this
는 함수의 현재 this 값
을 가져온다.
호출시점에 this 가 undefined 로 결정 되었다.
메서드로 호출 된 것이 아니라, 함수로써 호출 되었기 때문이다.
this 가 undefined 이므로, 에러가 발생
객체 리터럴을 사용하지 않은 this 도 같은 결과이다.
user.ref() 가 메서드가 되고, this 는 앞의 객체를 가리키기 때문에 에러가 발생하지 않는다.