자바스크립트에서 This는 호출된 함수의 컨텍스트에 따라서 값이 결정된다. 즉 언제 어떻게 함수가 호출되었냐에 따라서 달라진다.
console.log(this); // Window {parent: Window ... }
const myFunction = function() {
console.log(this);
}
myFunction(); // Window
(예제1)
const myFunction = function() {
console.log(this.a);
}
const a = 5 ;
myFunction(); // 5
(예제1) 메소드
const john = {
name: 'John',
greet: function(person) {
console.log(`Hi ${person} my name is ${this.name}`)
}
}
john.greet("Mark"); // Hi Mark my name is John
(예제2) 오브젝트의 메소드를 변수에 할당
const greeting = john.greet;
greeting("Mark"); // Hi Mark, my name is
(예제1) 화살표 함수
const person = {
name: "jason",
shout: () => console.log("my name is ", this.name)
}
person.shout() // my name is
(예제2) Shorter syntax를 사용하고 싶다면?
const person = {
name: "Jason",
shout() {
console.log("Hi, my name is", this.name);
}
};
person.shout() // my name is Json
(예제1)
const body = document.querySelector('body');
body.addEventListener('click', function() {
console.log(this); // <body>...<body>
});
(예제2) bind를 통해 this 명시한 경우
const body = document.querySelector('body');
const obj = { a: 'a' };
body.addEventListener('click', function() {
console.log(this); // {a: "a"}
}.bind(obj));
Function.Prototype
으로 부터 call/apply/bind
를 상속받는다.call/apply/bind
를 사용해서 this
를 직접 명시할 수 있다.functionName.call()
과 같이 사용한다.Call / Apply
const car = {
registrationNumber: "123",
brand: "Toyota"
}
function displayDetails(ownerName) {
console.log(ownerName + ", this is your car: " + this.registrationNumber + " " + this.brand);
}
// apply
displayDetails.apply(car, ["Vivian"]); // Vivian, this is your car: 123 Toyota
// call
displayDetails.call(car, "Vivian"); // Vivian, this is your car: 123 Toyota
bind
(예제1)
const car = {
registrationNumber: "123",
brand: "Toyota",
displayDetails: function(){
console.log(this.registrationNumber + " " + this.brand);
}
}
const myCarDetails = car.displayDetails.bind(car);
myCarDetails(); // 123 Toyota
(예제2) 파라미터와 함께 사용
const car = {
registrationNumber: "GA12345",
brand: "Toyota",
displayDetails: function(ownerName){
console.log(ownerName + ", this is your car: " + this.registrationNumber + " " + this.brand);
}
}
const myCarDetails = car.displayDetails.bind(car, "Vivian"); // Vivian, this is your car: 123 Toyota