undefined
이다.const a = {
name: 'oort',
booking(one, two) {
// 여기서 this는 a를 가리킨다.
console.log(this.name + `${one} ${two}`
}
}
// book 변수에 a의 booking 메서드를 재할당
const book = a.booking;
// 여기서 this는 undefined이다.
book(1, 2)
// call 메서드의 첫번째 인수는 this 키워드가 가졌으면 하는 값이다.
// 그리고 뒤에 메서드에 필요한 인수들을 입력한다.
book.call(a, 1, 2);
// 정상동작 => oort12
book
이라는 변수에 a
의 메서드인 booking
을 재할당했다.book
함수를 호출하면 book
의 소유주는 없기 때문에 book
에서 사용한 this 키워드는 undefined
가 된다.book
함수를 직접 호출한 것이 아니다.a
라는 키워드로 book
함수를 호출한 것이다.const a = {
name: 'oort',
booking(one, two) {
// 여기서 this는 a를 가리킨다.
console.log(this.name + `${one} ${two}`
}
}
const book = a.booking;
// 여기서 this는 undefined이다.
book(1, 2)
const argu = [1, 2];
book.call(a, argu);
const a = {
name: 'oort',
book(num, value) {
// this === a
console.log(`${num} ${this.name} ${value}`)
}
}
const b = {
name: 'www',
}
// this === undefined
const book = a.book
// this === b
const bookB = book.bind(b)
// 첫번째 키워드는 call과 마찬가지로 this에 할당할 값
// 그 뒤에 인수는 입력이 자유롭다.
// 전부 넣어도 되고, 나중에 넣어도 되고, 일부만 넣어줘도 된다.
// 일부 인수 미리 지정해줄 경우
const bookB = book.bind(b, 12)
bookB('a')
이 특성을 활용하여 인수가 미리 지정된 새로운 함수를 만들 때 사용할 수 있다.
아래 예시처럼 this 키워드가 필요없을 때는 null
을 넣는 것이 관습이다.
인수의 순서가 중요하다.
default parameter와 결과가 비슷해보이지만, bind는 범용 함수에 근거해서 인수를 미리 지정해놓은 새로운 함수를 리턴하는 것이기 때문에 다르다.
// 범용 함수
const addTex = (rate, value) => value + rate*value
// 범용함수에 근거해서 인수를 미리 지정해준 새로운 함수
const addVAT = addTax.bind(null, 0.23);
document.querySelector('.buy').addEventListener('click', a.book.bind(b))
const nav = document.querySelector('.nav')
// this를 사용하고 싶으면 화살표 함수가 아닌 정규 함수를 사용해야 한다.
const clickHandler = function(event) {
console.log(event.currentTarget) // nav element
// 추가하고 싶은 인수를 bind 메서드를 이용하여 this에 할당하여 사용한다.
console.log(this) // 20
}
// 추가하고 싶은 인수를 this에 할당 => this === 20
nav.addEventListenr('click', clickHandler.bind(20)
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/call
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
https://www.udemy.com/course/the-complete-javascript-course/