this의 바인딩 그리고 call, apply, bind 메서드
- 1) 일반 함수 내부에서의
this는 글로벌 객체와 바인딩됨
console.log(this === window);
a = 30;
console.log(window.a);
function x() {
return this;
}
x() === window;
- 2) 메서드 내부에서의
this는 메서드를 호출한 객체와 바인딩
let ranoInfo = {
name: 'Rano',
nickName: 'agumon',
getInfo() {
return `Name: ${this.name} NickName: ${this.nickName}`;
},
};
console.log(ranoInfo.getInfo());
- 3) 생성자 함수 내부에서
this는 생성자 함수가 생성할 인스턴스와 바인딩 됨.
function ranoInfo() {
(this.name = 'Rano'), (this.nickName = 'agumon');
this.getInfo = function () {
return `Name: ${this.name} NickName: ${this.nickName}`;
};
}
let ranoInfoTmp = new ranoInfo();
console.log(ranoInfoTmp);
-
4) Call, Apply, Bind 메서드 사용 시, 메서드에 첫 번째 인수 로 전달하는 객체에 바인딩!
-
call & apply 메서드는 기본적으로 함수를 호출하는 역할을 함
- 기존 함수 호출과의 차이점은?
이 메서드들 (call & apply)을 사용해 함수를 실행하면 함수의 첫 번째 인자로 전달하는 객체에 this를 바인딩 할 수 있음.
이를 통해서 유사 배열 arguments 객체에 배열 메서드를 사용할 수 있음.
-
bind는 첫 번째 인자를 this에 바인딩하지만 함수를 실행하지 않음, 새로운 함수를 반환
-
4-1) Call
call을 사용하면 함수를 실행하고 함수의 첫 번째 인자로 전달하는 값에 this를 바인딩
function logInfo(num1, num2, num3) {
console.log('name:', this.name);
console.log('gender:', this.gender);
console.log('money:', num1 + num2 + num3);
}
const rano = {
name: 'Rano',
gender: 'Unknown',
};
logInfo.call(rano, 0, 1, -1);
- 4-2)
Apply
apply를 사용하면 함수를 실행하고 함수의 첫 번째 인자로 전달하는 값에 this를 바인딩
> call과 차이점은 인자를 배열 형태로 전달하는 것. (인자로 배열 자체가 전달하는 것이 아닌 배열의 요소들 값으로 전달.)
function logInfo(num1, num2, num3) {
console.log('name:', this.name);
console.log('gender:', this.gender);
console.log('money:', num1 + num2 + num3);
}
const rano = {
name: 'Rano',
gender: 'Unknown',
};
const nums = [0, 1, -1];
logInfo.apply(rano, nums);
logInfo.call(rano, ...nums);
- 4-3)
Bind
bind는 함수의 첫 번째 인자에 this를 바인딩한다는 점은 같음.
하지만 함수를 실행하지 않고 새로운 함수를 반환
> 반환된 새로운 함수를 실행해야 원본 함수가 실행됨!!
function logInfo(num1, num2, num3) {
console.log('name:', this.name);
console.log('gender:', this.gender);
console.log('money:', num1 + num2 + num3);
}
const rano = {
name: 'Rano',
gender: 'Unknown',
};
const RanoLogInfo = logInfo.bind(rano, 0);
RanoLogInfo(-1, 1);
바로 위 RanoLogInfo를 bind 함수를 통해 생성할 때 차라리..
const RanoLogInfo = logInfo.bind(rano, 0);
const RanoLogInfo = logInfo.bind(rano, ...[0, 1, -1]);
JavaScript에서의 this와 call, apply, bind 메서드
this란?
JS에서 함수의 this 키워드는 다른 언어들과 비교하여 조금 다르게 동작.strict mode와non-strict mode사이에서도 조금 다름.this의 값은 함수를 호출하는 방법에 의해 결정this값이 함수가 어떻게 호출되었는지 설정할 수 있는bind메서드가 나옴this의 이해
바인딩이란?
this의 호출 방식에 따라this가 특정 객체 에 연결됨.this의 바인딩 그리고call,apply,bind메서드this는 글로벌 객체와 바인딩됨this는 메서드를 호출한 객체와 바인딩this는 생성자 함수가 생성할 인스턴스와 바인딩 됨.4)
Call,Apply,Bind메서드 사용 시, 메서드에 첫 번째 인수 로 전달하는 객체에 바인딩!call&apply메서드는 기본적으로 함수를 호출하는 역할을 함이 메서드들 (
call&apply)을 사용해 함수를 실행하면 함수의 첫 번째 인자로 전달하는 객체에this를 바인딩 할 수 있음.이를 통해서 유사 배열 arguments 객체에 배열 메서드를 사용할 수 있음.
bind는 첫 번째 인자를this에 바인딩하지만 함수를 실행하지 않음, 새로운 함수를 반환4-1)
Callcall을 사용하면 함수를 실행하고 함수의 첫 번째 인자로 전달하는 값에this를 바인딩Applyapply를 사용하면 함수를 실행하고 함수의 첫 번째 인자로 전달하는 값에this를 바인딩>
call과 차이점은 인자를 배열 형태로 전달하는 것. (인자로 배열 자체가 전달하는 것이 아닌 배열의 요소들 값으로 전달.)Bindbind는 함수의 첫 번째 인자에this를 바인딩한다는 점은 같음.하지만 함수를 실행하지 않고 새로운 함수를 반환
> 반환된 새로운 함수를 실행해야 원본 함수가 실행됨!!
바로 위
RanoLogInfo를bind함수를 통해 생성할 때 차라리..정리
thisthis는 함수 호출 방식에 따라 동적으로 결정됨Call,Apply,Bind메서드 사용 -> 메서드에 첫 번째 인수로 전달하는 객체에 바인딩Call,Apply,Bind메서드Call메서드는 함수를 실행첫번째 인자에
this를 바인딩, 이후 값을 함수의 인자로 전달Apply메서드는 함수를 실행첫번째 인자에
this를 바인딩, 이후 값을 배열의 형태 로 받아 차례로 함수의 인자로 전달.bind메서드는 함수를 실행하지 않음첫번째 인자에
this를 바인딩한 새로운 함수를 반환.JavaScript에서의 this는 함수를 호출하는 방법에 따라 결정 (예시 정리)
(함수를 호출 할 때 마다 this가 가리키는 값이 다를 수 있음)
1) 전역에서
this를 호출this는 기본적으로window를 가르킴.2) 함수 안에서
this를 호출(bind 함수 & 화살표 함수 제외)
this가 결정3) 메소드에서
this를 호출 했을 경우this를 결정하는 것은 함수를 호출한 객체가 무엇이냐에 따라 달라짐.doSomething함수를 obj의 메소드로 등록하고obj.doSomething()을 호출 했기 때문에this는obj.doSomething메소드 안에서 선언된func()함수지만 호출해보면console.log(this.a)에 10.(
obj객체와func함수는 아무런 관련이 없는 함수이기에)this를 가리키려면self변수에 객체의this를 저장해서 접근4) 생성자에서
this를 호출Person함수는window객체에 속한 함수그냥 호출하면
this.age는 전역 변수의age값을 가리키게 됨.Person함수를new키워드를 통해 생성하면 새로운 객체가 만들어지면서this는window가 아닌 생성한 객체를 가리키게 되고, 함수의 내용은 생성자가 됨.5)
bind메서드bind메서드는 함수 내의this를 영구적으로 지정하는 메서드.6) 화살표 함수
화살표 함수에서
this는 자신을 감싼 렉시컬 컨텍스트. 전역에서는window를 가리킴.bind나 화살표 함수는this를 지정하면 변하지 않음.참고자료