this
는 현재 실행되는 코드의 실행 컨텍스트를 가리킨다.this
와 성격이 다르다this
는 함수 자신이나 함수의 렉시컬 스코프를 가리키는 레퍼런스가 아니라는 점을 분명히 인지this
가 동적으로 변경된다.this
란 자기자신을 가리키는것이 아닌 함수 호출 시점에 바인딩되며 무엇을 가리킬지는 전적으로 함수를 호출한 코드에 달려있다.console.log(this); // window 객체
function logFunc() {
console.log(this);
}
logFunc(); // window 객체
/*
global에서 호출하는것은 window에서 호출하는 것과 같다. === window.logFunc()
*/
class LogClass {
log() {
console.log(this);
}
}
const bar = new LogClass();
bar.log(); // LogCLass 객체
class BoB {}
const bob = new Bob();
bob.run = test.log;
bob.run(); // BoB 객체
/*
run() 함수는 bob이 호출했기 때문에 this는 BoB을 가리킨다.
자바스크립트 this라는 정보를 가진 함수를 다른곳에 할당하는 순간 잃어버린다.
*/
class LogClass {
log() {
console.log(this);
}
}
const bar = new LogClass();
const foo = bar.log();
foo(); // undefined
/*
let과 const로 등록된 변수는 윈도우에 등록되어져 있지 않으므로 선언한 변수를
호출하는 것은 global(window)가 아니고 어떤 Object도 아니기 때문에 undefined
*/
bind: 결속시키다, 묶다.
this
를 특정 객체로 묶는 역할this
는 바인딩 우선순위를 결정하는 표준 바인딩 규칙을 가지고 있다.class LogClass {
log() {
console.log(this);
}
}
const bar = new LogClass();
const foo = bar.log();
foo(); // undefined
const foo2 = bar.log.bind(bar); // bar(LogClass)로 바인딩
단독 함수실행
에 관한 규칙으로 나머지 규칙에 해당하지 않을 경우 적용되는 this
의 기본 규칙const foo = bar.log;
: bar 바인딩이 소실됨call()
, apply()
: Soft Bindingthis
에 바인딩 할 객체를 첫 째 인자로 받아 함수 호출시 객체를 this
로 세팅한다.this
바인딩이 도중에 소실되거나 프레임워크가 임의로 덮어져 써버리는 경우 해결 Xbind()
Hard Bindingthis
콘텍스트로 원본 함수를 호출하도록 하드코딩된 새 함수를 반환this
를 새 객체와 바인딩을 하는 방법() => {}
: 선언될 당시에 scope에 this context를 유지this
를 바인딩한다.