(아래 글은 2022.02.18에 학습한 내용을 정리한 글입니다.)
오늘 배운 것은 전역객체와 this의 사용법에 대한 내용이다.
전역객체는 window
라는 이름을 가진 객체로, 자바스크립트 안에서 모든 객체는 기본적으로 이 전역객체 내의 객체가 된다. 전역객체는 기본적으로 모든 코드에 적용이 되기 때문에, 코드를 작성할 때 굳이 전역객체를 붙일 필요는 없다.
하지만, 아래와 같이 전역객체를 사용하여 함수를 호출하더라도 일반적으로 함수를 호출할 때와 동일하게 실행되는 것을 알 수 있다.
function a(){
console.log("Hello?");
}
window.a();
let hi = {
b: function() {
console.log("Hi");
},
}
window.hi.b();
this
는 자기 자신을 가리키는 상황에 따라 가리키는 대상이 달라지는데, 이는 함수를 어떻게 호출하느냐가 기준이 된다. 함수와 객체 사이의 느슨한 관계를 this
가 연결키는 역할을 해주는 것이다.
기본적으로, this
는 전역객체인 window
와 같다.
function func()
if(window === this) {
console.log("window is this.");
}
func();
this
는 그 객체를 가리킨다. let hi = {
a: function() {
if(hi === this)
console.log("hi === this");
},
}
hi.a();
함수가 생성자로 호출될 때 this
가 포함될 경우 this
는 그 생성자가 만든 객체를 가리키게 된다.
let funcThis = null;
function Func() {
funcThis = this;
}
let a1 = func();
if(funcThis === window) {
console.log("window");
}
let a2 = new func();
if(funcThis === o2) {
console.log("a2");
}
이때, 생성자로 생성되는 객체는 함수의 호출이 끝난 후에 할당되기 때문에, 아래와 같은 방식으로 함수에 if문을 기입하여 this
가 객체를 가리키는지 판단할 경우 객체에 접근할 수 없어서 오류가 발생하게 된다.
function Func() {
if(a2 === this) {
console.log("o2")
}
}
let a2 = new func();
a2();
apply
를 통해 함수를 불러올 때 적용시킬 case
를 지정할 수 있다. 단, case
내의 코드가 한 번 작동하기 시작하면 break
를 만나기 전까지 자신 아래에 있는 case
의 코드까지 실행하게 된다. 전역객체는 함수를 불러올 때 apply
를 사용하지 않아도 적용된다.let o = {}
let p = {}
function func() {
switch(this) {
case o:
console.log("o");
break;
case p:
console.log("p");
break;
case window:
console.log("window");
break;
}
}
func();
func.apply(o);
func.apply(p);