[JavaScript] This, new 키워드
2022. 7. 16. 22:12ㆍWEB/Javascript
c++, c#에서의 this는 인스턴스 자기 자신을 가리키는 포인터로 사용이 된다.따라서 this키워드를 이용하여 자신의 메서드나 변수에 접근할 수 있었다.
그러나 javascript의 this는 조금 다르다. javascript의 this는 '함수의 호출 방식'에 따라 this에 바인딩 되는 객체가 달라진다.
- 내부함수가 일반 함수, 메서드, 콜백함수라면 어디에서 선언되었든 관게없이 this는 전역객체를 바인딩한다.
let obj = { myVar: 'foo', myFunc: function() { console.log(this.myVar) setTimeout(function() { console.log(this.myVar) }, 1000) } } obj.myFunc() // foo ... undefined
- 해결방법은 this를 변수에저장해서 사용하는것과 화살표함수 사용, apply, call ,bind함수를 사용한다.
# 함수 호출 방식
var foo = function () {
console.dir(this); //this 는 Browser-side : window객체, node.js : global 객체
};
객체 리터럴 방식
let obj = {
value : 100,
foo : function() {
that = this;
console.dir(that); //obj
}
}
- 생성된 프로토타입 객체는 Object.property
생성자 함수 방식
- 자바스크립트에서 생성자 함수는 객체를 생성하는 역할을 한다. 이 역시도 C++,C#의 생성자 함수와는 다르게 작동한다.
- c++,c#과 마찬가지로 해당 함수를 호출하여 객체를 초기화하는건 공통적인 부분인듯함.
- 생성자 함수에 new 연사자를 붙여서 변수에 할당하면(호출하면) 해당 함수는 생성자 함수로 동작한다.
- 생성자 함수는 함수명의 첫번째 글자를 대문자로 지어서 혼란을 방지한다고 한다.
function testfunc(name) {
this.name = name // window
}
let t1 = testufnc("kd");
function testfunc(name) {
this.name = this; //testfunc
}
//new 연산자를 이용하여 호출하면 window가아닌 해당 함수를 가리킨다.
let t2 = new testfunc("k");
//생성자를 호출하면 객체가 생성된다. testfunc함수를 이용하여 객체를 생성함.
typeof t2 //object
object.keys(t2) // ['name']
- 생성된 프로토타입 객체는 호출한 함수.property
- new 연산자 없이 작동을 시키면 this는 window를 가리키고 window에 name을 할당하는 꼴이 된다.
# 생성자 함수 동작 방식 - 빈객체 생성 및 this 바인딩
- 할당한 생성자 함수 실행 전 빈객체 생성
- 생성자 함수 내에서 사용되는 this는 생성한 빈 객체를 가리킨다.
- 따라서 할당한 생성자 함수내에서 this를 이용하여 만든 프로퍼티는 이 빈객체에 할당된다.
- return문이 없거나 return this를 하면 호출한 변수에 할당된다.
# 화살표 함수의 this
let obj = {
value : 100,
foo : ()=> {
that = this;
console.dir(that); //window
}
}
- 화살표 함수의 this는 선언 시점의 상위 스코프인 전역객체를 가리키게 된다(현재 스코프는 obj). 따라서 위와같은 경우엔 Window를 가리키게된다.
- 마찬가지로 생성자 함수로 사용이 불가능하다. 그 이유는 생성자 함수의 동작 방식을 보면 된다.
'WEB > Javascript' 카테고리의 다른 글
[JavaScript] 객체지향의 특징과 클래스 객체 인스턴스 차이 (0) | 2022.07.22 |
---|---|
[JavaScript] 프로토타입 (prototype) (0) | 2022.07.20 |
[JavaScript] Event에 관하여 (0) | 2022.07.15 |
[JavaScript] DocumentFragment 장점 (0) | 2022.07.15 |
[JavaScript] DOM(Document Objecet Model) (0) | 2022.07.14 |