지식 보충을 위해 조금씩 정리를 해보자! #4
position 속성은 HTML 태그로 제작한 문서의 요소들를 어떻게 위치시킬지를 정의하는 속성이다. 총 5가지 값을 갖고 있고, 좌표를 지정해주기 위해서 left, right, top, bottom 속성과 함께 사용한다.
style="top:5px; left: 5px;"
을 적용 시, 왼쪽으로부터 5px, 위쪽으로부터 5px 이동하는 형식이다. 자바스크립트의 함수는 호출될 때, 매개변수로 전달되는 인자값 이외에, arguments 객체와 this를 암묵적으로 전달 받고, 함수 호출 방식에 의해 this에 바인딩할 어떤 객체가 동적으로 결정된다.
다시 말해, 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정되는 것이 아니고, 함수를 호출할 때 함수가 어떻게 호출되었는지에 따라 this에 바인딩할 객체가 동적으로 결정된다.
출처: poiemaweb
function func(){
// 익명 함수를 생성하고, 함수 내에 로직을 설정한다.
if(window === this) {
// 만약 window와 this의 값이 같다면,
console.log("window===this")
// 콘솔에 "window===this"라는 문자열을 출력한다.
}
}
func();
// 그리고 해당 함수를 호출하면,
// result
"window===this"
// 콘솔에 "window===this"라는 문자열이 출력된다.
let o = {
// 이번엔 객체를 생성한다.
func:function(){
// func라는 키의 값으로 함수를 설정한다. (해당 함수는 메소드가 된다)
if(o === this){
// 만약 객체인 o가 this와 같다면,
console.log("o===this")
// "o===this"라는 문자열을 콘솔에 출력한다.
}
}
o.func();
// 객체 o의 메소드로 func()를 호출하면,
// result
"o===this"
// 콘솔에 "o===this"라는 문자열이 출력된다.
this
라고 하는 것이 그 메소드가 소속된 객체를 가르키기 때문에 함수를 호출했을 때 this
의 값이 window
가 되는 것과 어떠한 객체에서 메소드를 호출했을 때 그 thi
s의 값이 그 메소드의 소속인 객체를 가르킨다는 건 같은 의미이다.window
가 암시적으로 사용되기 때문에 우리가 보기에 함수 호출과 메소드 호출이 달라보이기 때문에 동일하게 보이지 않는 것 뿐이다.let funcThis = null;
// 함수 정의
function Func(){
funcThis = this;
}
// 일반 함수 호출
const o1 = Func();
// 1. 해당 함수 실행 시, Func()가 실행된다.
// 1-1. 이때 Func() 안에 있는 funcThis는 변수 선언문이 없기 때문에, 전역으로 선언되어있는 funcThis와 동일하다.
// 1-2. 그렇기 때문에 일반적으로 Func()를 호출했을 때 Func()에서 가르키는 this는 null을 값으로 갖고있다.
if(funcThis === window){
// 2. 일반 함수 호출 시 funcThis는 전역으로 호출된 funcThis와 같기 때문에 window가 된다.
// 2-1. 함수를 호출하면 함수는 window라는 객체의 메소드이기 때문이다.
console.log('window')'
}
// 생성자로서 함수 호출
const o2 = new Func();
// 3. 생성자로 함수를 호출할 경우, 자바스크립트는 내부적으로 비어있는 객체를 만든다.
// 3-1. 비어있는 객체는 생성자 안에서의 this가 된다. (새로 생성되는 객체가 생성자 안에서의 this가 된다는 것!)
// 3-2. new Func() 생성자 함수의 내용도 동일하게 funcThis를 this로서 갖게된다.
// 3-3. 여기서 this는 전역 변수 funcThis이기 때문에 일반 함수 호출과 정확하게 같은 값 (null)을 갖는다.
if(funcThis === o2){
// 4. 다만 달라지는 것은 funcThis의 소속(?)이다.
// 4-1. 생성자를 통해서 만들어진 객체는 o2에 담겨있기 때문에, 생성자의 맥락으로 this가 변한다.
// 4-2. Func()에 담겨있던 this는 일반 호출의 경우와 다르게 window가 아니라 this가 속해있는 객체(o2)를 가르키게 된다.
console.log('o2');
}
const o = {}
const 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();
// 1. func의 this (switch 안에 this) 는 window가 된다.
// 1-1. 그렇기 때문에 case window에 있는 로직이 실행된다.
// 함수는 객체이기 떄문에 apply라는 표준 메소드를 사용할 수 있다.
func.apply(o);
// 2. apply의 첫번째 인자는 '함수 호출 컨텍스트'이다.
// 2-1. 그렇기 때문에 해당 함수는 func() 함수를 실행하면서, switch문에 있는 this는 선언된 객체 o를 가르키게된다.
// 2-2. case o에 있는 로직이 실행된다.
func.apply(p);
// 3. 위와 동일한 방식으로 인자를 p로 설정한다면,
// 3-1. switch문 안에 있는 this는 선언된 객체 p를 가르키게되고, case p에 있는 로직이 실행된다.
"함수 호출 방식에 의해 this에 바인딩할 어떤 객체가 동적으로 결정된다."
this는 변화무쌍하다! 함수가 누구의 소속인지에 따라 this의 값은 함수가 소속된 객체를 가르킨다!
출처: