Function.prototype.call()
call() 메소드는 주어진 this 값 및 각각 전달된 인수와 함께 함수를 호출
구문 및 매개변수
func.call(thisArg[, arg1[, arg2[, ...]]])
thisArg: func 호출에 제공되는 this의 값.
arg1, arg2, ...: func이 호출되어야 하는 인수
예시 코드 및 설명
let person1 = {
name: 'Son',
};
let person2 = {
name: 'Kim',
study: function () {
console.log(this.name + '이/가 공부를 하고 있습니다.');
},
};
person2.study();
person2.study.call(person1);
-
위 예시 코드를 보면 call을 이용하여 person2의 함수를 호출하지만
call 메소드 첫 번째 매개변수에 person1을 넣어주고 있기에 this는 person2가 아닌 person1을 가리키게 됨.
-
call의 첫 번째 매개변수 thisArg는 각 함수의 실행문맥의 this를 특정하게 지정하는 매개변수임.
- 두 번째 매개변수부터는 호출할 함수의 인자들이 들어감.
- 두번째 매개변수부터는 대상함수의 인수 앞에 삽입됨
❓ 두 번째 매개변수부터는 "호출할 함수의 인자들"을 사용한 예시 코드
let person3 = {
name: 'Yrano',
};
let person4 = {
name: 'Rano',
info: function (gender, age) {
console.log(`this.name: ${this.name}, gender: ${gender}, age: ${age}`);
},
};
person4.info.call(person3, 'Unknown', 2000);
- 이 예시 코드의
person4.info()는 2개의 매개변수가 필요
person4의 name을 기준으로 실행하려면 person4.info("Unknown", 2000) 이렇게 해주면 되지만,
person3의 name을 기준으로 실행하려면 person4.info.call(person3, 'Unknown', 2000); 이렇게 실행!
apply()와 차이
- 이 함수 구문은
apply()와 거의 동일하지만,
call()은 인수 목록을, (배열은 전개연산자등을 사용하여 값을 넣을 수 있음)
반면에 apply()는 인수 배열 하나를 받는다는 점이 중요한 차이.
Function.prototype.apply()
apply() 메서드는 주어진 this 값과 배열 (또는 유사 배열 객체) 로 제공되는 arguments 로 함수를 호출
구문 및 매개변수
func.apply(thisArg, [argsArray]);
thisArg: func 호출에 제공되는 this의 값
argsArray: func이 호출되어야 하는 인수를 지정하는 유사 배열 객체
예시 코드 및 설명
let fruit1 = { name: '사과' };
function fruitInfo(price, color) {
return console.log(`${this.name}은/는 ${price}원이며 ${color}색입니다`);
}
const arrFruit1Info = [2000, '빨간'];
fruitInfo.apply(fruit1, arrFruit1Info);
- 첫 번째 매개변수 thisArg는
Function.prototype.call()과 같이 this를 지정한다.
하지만 call()과 다르게 apply()는 두 번째 매개변수를 배열 형태로 넣게된다는 차이점이 있다.
(배열 또는 유사배열 객체)
call()와 차이
- 이 함수의 구문은 거의
call() 구문과 유사.
차이점은 call() 은 함수에 전달될 인수 리스트를 받는데 비해,
apply() 는 인수들의 단일 배열을 받음
call과 apply를 좀 더 구분하자면..
call은 다른 관심사의 인자를 여러개 넣을 때
apply는 같은 관심사로 묶인 유사배열을 넣을 때
Function.prototype.bind()
bind()는 새롭게 바인딩한 함수를 만들고 바인딩한 함수는 원본 함수 객체를 감싸는 함수다.
bind()는 call(), apply()와 같이 함수가 가리키고 있는 this를 바꾸지만 호출되지는 않는다.
따라서 변수를 할당하여 호출하는 형태로 사용된다.
구문 및 매개변수
func.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg: 바인딩 함수가 타겟 함수의 this에 전달하는 값
arg1, arg2, ...: func이 호출되어야 하는 인수
예시 코드 및 설명
let fruit1 = { name: '사과' };
let fruit2 = {
name: '바나나',
fruitInfo: function (price, color) {
return console.log(`${this.name}은/는 ${price}원이며 ${color}색입니다`);
},
};
const arrFruit1Info = [4000, '빨간'];
const appleInfo = fruit2.fruitInfo.bind(fruit1, ...arrFruit1Info);
appleInfo();
- 위에서 설명했듯 첫번째 매개변수엔
thisArg
두번째 매개변수는 타겟 함수에서 호출되어야 할 인수들.
call과 같이 두번째 매개변수는 인수 목록을 받음
(배열이 아닌 일반적인 값 입력. 배열을 두번째 매개변수로 주려면 전개연산자 활용)
참고자료
Function.prototype.call()call()메소드는 주어진 this 값 및 각각 전달된 인수와 함께 함수를 호출구문 및 매개변수
thisArg: func 호출에 제공되는 this의 값.arg1,arg2,...: func이 호출되어야 하는 인수예시 코드 및 설명
위 예시 코드를 보면
call을 이용하여 person2의 함수를 호출하지만call메소드 첫 번째 매개변수에 person1을 넣어주고 있기에this는 person2가 아닌 person1을 가리키게 됨.call의 첫 번째 매개변수 thisArg는 각 함수의 실행문맥의this를 특정하게 지정하는 매개변수임.❓ 두 번째 매개변수부터는 "호출할 함수의 인자들"을 사용한 예시 코드
person4.info()는 2개의 매개변수가 필요person4의 name을 기준으로 실행하려면person4.info("Unknown", 2000)이렇게 해주면 되지만,person3의 name을 기준으로 실행하려면person4.info.call(person3, 'Unknown', 2000);이렇게 실행!apply()와 차이apply()와 거의 동일하지만,call()은 인수 목록을, (배열은 전개연산자등을 사용하여 값을 넣을 수 있음)반면에
apply()는 인수 배열 하나를 받는다는 점이 중요한 차이.Function.prototype.apply()apply()메서드는 주어진this값과 배열 (또는 유사 배열 객체) 로 제공되는arguments로 함수를 호출구문 및 매개변수
thisArg: func 호출에 제공되는 this의 값argsArray: func이 호출되어야 하는 인수를 지정하는 유사 배열 객체예시 코드 및 설명
Function.prototype.call()과 같이this를 지정한다.하지만
call()과 다르게apply()는 두 번째 매개변수를 배열 형태로 넣게된다는 차이점이 있다.(배열 또는 유사배열 객체)
call()와 차이call()구문과 유사.차이점은
call()은 함수에 전달될 인수 리스트를 받는데 비해,apply()는 인수들의 단일 배열을 받음Function.prototype.bind()bind()는 새롭게 바인딩한 함수를 만들고 바인딩한 함수는 원본 함수 객체를 감싸는 함수다.bind()는call(),apply()와 같이 함수가 가리키고 있는this를 바꾸지만 호출되지는 않는다.따라서 변수를 할당하여 호출하는 형태로 사용된다.
구문 및 매개변수
thisArg: 바인딩 함수가 타겟 함수의 this에 전달하는 값arg1,arg2,...: func이 호출되어야 하는 인수예시 코드 및 설명
thisArg두번째 매개변수는 타겟 함수에서 호출되어야 할 인수들.
call과 같이 두번째 매개변수는 인수 목록을 받음(배열이 아닌 일반적인 값 입력. 배열을 두번째 매개변수로 주려면 전개연산자 활용)
참고자료