whatisthis?
javaScript. (21) 함수의 메소드와 argument 본문
지난 강의에서는 숫자 / 배열 / 문자열에 대한 메서드를 배웠었다.
(예> Number.toFixed() / Array.join() / String.split() 등)
사실은 '함수'도 메서드가 존재한다.
>> 가장 핵심적인 것은 call / bind / apply 이다.
원래 함수는 선언한 후 호출을 해야 실행된다.
호출하는 방법에는 일반적으로는 뒤에 ()를 붙이지만,
call과 apply로 호출할 수 있다.
💡 call과 apply
<호출>
- 함수 뒤에 ()를 붙임
- call 과 apply
call은 보통 함수와 똑같이 인자를 넣음
apply는 인자를 하나의 배열로 묶어 넣음
let example = (a,b,c => a+b+c); // example 함수 선언
example.call(null, 1, 2, 3);
example.apply(null, [1, 2, 3]);
** call과 apply가 공통적으로 가진 null인자의 역할은?
this를 대체하는 것.
var obj = {
string: 'zero',
yell: function() {
alert(this.string);
}
};
var obj2 = {
string: 'what?'
};
obj.yell(); // 'zero';
obj.yell.call(obj2); // 'what?'
여기서 객체 두개를 선언하고 각 string값이 zero와 what?임을 주목하자.
분면 yell함수는 obj에 해당하는 메소드임에도 마지막 줄에서
obj.yell.call(obj2)는 what? (obj2의 string값)이 된다.
>> 즉 다른 객체의 함수를 자기 것마냥 사용할 수 있음!
즉, obj의 this가 obj2로 바뀐 것이므로
obj.yell에서
this.string이 obj2.string이 된 것임.
this는 기본적으로 window객체를 의미함.
이 때 몇가지 방법으로 window를 다른 것으로 바꿀 수 있음
- call, apply, bind에서 첫번째 인자로 다른것을 넣어주기.
let example = (a,b,c => a+b+c); // example 함수 선언
example.call(null, 1, 2, 3);
example.apply(null, [1, 2, 3]);
첫 번째 인자인 null은 this를 대체하므로 이 값을 바꿔주면 된다.
argument는 함수(function)이면 처음부터 갖고 있는 속성으로,
함수에 들어온 인자를 배열 형식으로 반환한다. (배열은 아님.)
이 때, argument 자체는 배열이 아니라 배열 메소드 등을 쓰면 에러가 발생하지만
이 때 call이나 apply를 사용하면 제대로 동작한다.
>> 배열의 프로토타입에 있는 join 함수를 빌려씀. this는 argument를 가리키게 함. (call의 첫번째 인자)
function example3() {
console.log(Array.prototype.join.call(arguments));
}
example3(1, 'string', true); // '1,string,true'
Array.prototype.join.call(arguments)
** join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만든다.
>> 기본적으로는 구분자가 컴마(,)가 된다?
💡 bind
bind 함수는 함수가 가리키는 this만 바꾸고 호출하지는 않음.
cf> apply, call은 함수의 호출에 사용 + 첫번째 인자(null)는 this를 대체
위의 zero와 what? 예제로 비교해보자.
var obj = {
string: 'zero',
yell: function() {
alert(this.string);
}
};
var obj2 = {
string: 'what?'
};
var yell2 = obj.yell.bind(obj2);
yell2(); // 'what?'
마찬가지로 두 객체와 변수 string / 함수 yell을 선언한다.
call과 apply에서는 obj.yell.call(obj2); 와 같이 해서 결과가 'what?'이 나왔었다.
즉, 함수를 호출 한 것이고
bind에서는 호출은 하지 않지 않고 함수만 반환한다.
obj.yell.bind(obj2)를 했더니 yell 함수의 this가 obj2로 바뀐 것이므로
call(this, 1, 2, 3) = bind(this)(1, 2, 3)
라고 할 수 있다.
>> 즉, bind는 호출이 빠진 call과 apply 쯤이라 생각.
호출하려면 ? ㅡ call / apply ㅡ 인자를 직접 넣으려면 call / 배열로 넣으려면 apply
호출하지 말고 this만 바인딩하려면 ? ㅡ bind
REFERENCE
https://www.zerocho.com/category/JavaScript/post/57433645a48729787807c3fd
이 포스팅은 zerocho님의 javascript 강의를 보고 작성한 글입니다.
공부+기록 용으로 작성한 것이며, 자세한 것은 위 포스팅을 참고하세요!
'WEB STUDY > JAVASCRIPT' 카테고리의 다른 글
javaScript. (23) 디자인 패턴 (싱글턴 / 모듈 / 생성자) (0) | 2022.01.30 |
---|---|
javaScript. (22) 객체의 복사 (0) | 2022.01.30 |
javaScript. 비동기 처리와 Callback 함수 (0) | 2022.01.30 |
javaScript. (20) Event Listener / Callback (0) | 2022.01.29 |
javaScript. 이벤트(on__)의 종류 (0) | 2022.01.28 |