hoonnotes
자기 참조 변수
생성자함수가 만들 인스턴스를 참조
메서드나 프로퍼티가 속한 객체를 참조
function Person(name, job) {
this.name = name;
this.job = job;
}
Person.prototype.introduce = function () {
console.log(`안녕하세요. 저는 ${this.occupation} ${this.name} 입니다`);
};
const hoon = new Person("hoon", "marketer");
const jane = new Person("jane", "ux writer");
function Person(name, job) {
// this = {}
this.name = name;
this.job = job;
// return this {
// name: name,
// job: job
// }
}
Person.prototype.introduce = function () {
console.log(`안녕하세요. 저는 ${this.occupation} ${this.name} 입니다`);
};
const hoon = new Person("hoon", "marketer");
const jane = new Person("jane", "ux writer");
함수 호출 방식
1. 일반 함수 호출
2. 메서드 호출
3. 생성자 함수 호출
4. Function.prototype.apply / bind/ call
const normal = function () {
console.log(this); // global
};
normal();
const methods = {
method: function () {
// { methods: [Function] } <= methods 객체
console.log(this);
},
};
methods.method();
function Constructor() {
console.log(this);
}
new Constructor(); // Constructor { }
const indirect = { name: "hoon" };
normal.call(indirect); // { name: 'hoon' } <= indirect 객체
normal.apply(indirect); // { name: 'hoon' } <= indirect 객체
normal.bind(indirect)(); // { name: 'hoon' } <= indirect 객체
일반 함수 호출하는 경우
this는 전역 객체에 바인딩
function test() {
console.log(this);
function inner() {
console.log(this);
}
inner();
}
test();
메서드 내부에 일반함수로 정의한 경우
this는 전역 객체에 바인딩
const student = {
course: "JavaScript Deep Dive",
getInfo() {
console.log("getInfo의 this: ", this);
console.log("공부중인 과목: ", this.course);
function test() {
console.log("메서드 안의 일반함수 this: ", this);
}
test();
},
};
student.getInfo();
콜백함수가 일반함수로 정의되는 경우
this는 전역 객체에 바인딩
const student = {
course: "JavaScript Deep Dive",
getInfo() {
console.log("getInfo의 this: ", this);
console.log("공부중인 과목: ", this.course);
setTimeout(function () {
console.log("메서드 안의 일반함수 this: ", this);
}, 300);
},
};
student.getInfo();
콜백함수가 일반함수로 정의되는 경우
this는 전역 객체에 바인딩
const student = {
course: "JavaScript Deep Dive",
getInfo() {
const that = this;
setTimeout(function () {
console.log(`${that.course}를 공부중입니다`);
}, 300);
setTimeout(() => {
console.log(`${that.course}를 공부중입니다`);
}, 300);
},
};
student.getInfo();
메서드로 호출되는 경우
this는 메서드를 호출한 객체에 바인드
const person = {
name: "hoon",
getName() {
return this.name;
},
};
person.getName();
person
<function object>
this
...
...
...
name
getName
hoon
<function>
differentPerson
name
getName
jane
<function>
const person = {
name: "hoon",
getName() {
console.log(this.name);
},
};
person.getName();
const differentPerson = {
name: "jane",
};
differentPerson.getName = person.getName;
differentPerson.getName();
this에 바인딩 될 객체는, 메서드가 호출되는 시점에 결정된다!
function Person(name) {
console.log(this);
this.name = name;
console.log(this);
}
const hoon = new Person("hoon");
생성자 함수로 호출되는 경우
this는 생성될 인스턴스에 바인드!
/**
* @param thisArg - this 로 사용될 객체
* @param argsArray - 함수에 전달할 인수 리스트
* @returns 호출된 함수의 반환값
*/
Function.prototype.apply(thisArgs, [, argsArray])
/**
* @param thisArg - this 로 사용될 객체
* @param arg1, arg2, ... - 함수에 전달할 인수 리스트
* @returns 호출된 함수의 반환값
*/
Function.prototype.call(thisArgs, [, arg1[, arg2[, ...]]])
apply, call, bind 메서드로 호출되는 경우
this는 전달받은 인스턴스에 바인드
function tester() {
console.log(this);
}
tester();
const person = { name: "hoon" };
tester.apply(person);
tester.call(person);
apply, call, bind 메서드로 호출되는 경우
this는 전달받은 인스턴스에 바인드
class Foo extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('Click happened');
}
render() {
return <button onClick={this.handleClick}>Click Me</button>;
}
}
apply, call, bind 메서드로 호출되는 경우
this는 전달받은 인스턴스에 바인드
class Person {
constructor(name) {
this.name = name;
}
showname() {
console.log(this.name);
}
}
const hoon = new Person("hoon");
hoon.showname();
const showname = hoon.showname;
showname();
apply, call, bind 메서드로 호출되는 경우
this는 전달받은 인스턴스에 바인드