call, apply, bind

라용·2022년 8월 8일
0

인프런 강의 자바스크립트 중급 - 코딩앙마 를 듣고 정리한 내용입니다.

함수 호출 방식과 관계없이 this 를 지정할 수 있습니다. call 메소드는 모든 함수에서 사용할 수 있고 this 를 특정 값으로 지정할 수 있습니다.

const mike = {
	name: "MIke",
}
const tom = {
	name : "Tom",
}

function showThisName() {
	console.log(this.name);
}

showTihisName(); // 현재 this 는 window 를 가리킴
showThisName.call(mike); // , Mike - mike 를 this 로 받아서 출력 

생년과 직업이란 객체 정보를 받아서 업데이트 해주는 함수를 작성한다면,

function undate(birthYear, occupation) {
	this.birthYear = birthYear;
	this.occupation = occupation;
}

update.call(mike, 1999, "singer");
// 첫번째 매개변수는 this 로 들어가고, 그 다음부터는 함수가 사용할 매개변수 들
// 매개변수로 들어간 값은 해당 객체에 데이터 값으로 들어간다.

console.log(mike)
// => { name: "MIke", birthYear: 1999, occupation: "singer"}

applycall 과 동일하게 동작하돼 매개변수를 처리하는 방법이 다릅니다. call 은 일반 함수처럼 매개변수를 직접 받지만, apply 는 매개변수를 배열로 받습니다.

update.call(mike, 1999, "singer"); // 이것을 아래처럼 수정
update.apply(mike, [1999, "singer"]);

// 아래 배열에서 최소값 최대값을 찾는다고 할 때
const nums = [3, 10, 1, 6, 4];

// 아래처럼 스프레드 연산자를 써도 되지만
const minNum = Math.min(...nums);
const maxNum = Math.max(...nums);

// apply 나 call 을 써보면

const minNum = Math.min.apply(null, nums);
// this 로 넣어줄 게 없으니 첫번째 값은 그냥 아무거나 넣고,
// 두번째 값에 배열을 담은 변수를 넣어준다.
// (null, [3, 10, 1, 6, 4]) - 이렇게 들어간 것

const maxNum = Math.max.call(null, ...nums);
// call 은 배열을 받지 않으니까 스프레드 연산자로 써줌 ..nums
// (null, 3, 10, 1, 6, 4) - 이렇게 들어간 것

bind 를 사용하면 함수의 this 값을 영구적으로 바꿀 수 있습니다.

const mike = {
	name: "MIke",
}

function undate(birthYear, occupation) {
	this.birthYear = birthYear;
	this.occupation = occupation;
}

const updateMike = update.bind(mike);
// this 를 항상 mike 로 받는 함수를 변수로 저장

updateMike(1980, "police");
// this 가 mike 인 객체에 값이 들어간 것

다른 예시를 살펴보면,

const user = {
	name: "Mike",
	showName: function() {
		console.log(`hello, ${this.name}`);
	},
};

user.showName(); 
// hello, Mike 가 나온다.

let fn = user.showName; 하고
fn();
// 이러면 hello, 만 나온다.
// fn 에 할당할 때 this 를 읽어버린 것

fn.call(user);
// call 을 사용해서 this 에 넣어줄 값을 담고 실행하면 hello, Mike 나온다. 

let boundFn = fn.bind(user);
boundFn(); 
// 이렇게 해도 bind 로 this 값을 고정해도 hello, Mike 가 나온다.
profile
Today I Learned

0개의 댓글