this를 바깥에서 쓰거나 일반 함수 안에서 쓰면 Window {}
를 호출한다. 함수나 변수를 전역 공간에서 만들면 Window {}
라는 Object에 보관한다. 따라서, Window {}
는 JavaScript의 기본 함수들 수납공간이라고 할 수 있다. 이러한 이유로, 함수를 호출할 때 보통 함수();
이렇게 호출하나, window.함수();
이렇게 호출해도 똑같은 결과를 받을 수 있다.
console.log(this)
// 결과
// Window {parent: Window, opener: null, top: Window, length: 0 ...중략}
function 함수(){
console.log(this);
}
함수();
// 결과
// Window {parent: Window, opener: null, top: Window, length: 0 ...중략}
스크립트 안 최상단에 'use strict'
사용하고 일반함수 내에서 this
를 쓰면 undefined
가 나온다
Object 내 함수 안에서 this를 쓰면 그 함수를 가지고 있는 Object
를 말한다.
var 오브젝트 = {
데이터 : 'function',
함수 : function(){
console.log(this)
}
}
오브젝트.함수();
// 결과
// {데이터: 'function', 함수: ƒ}
그럼 Object 내에 데이터를 중첩해서 넣는다면 어떻게 될까? 한 번 실험해보자!
var 오브젝트 = {
데이터 : {
함수(){
console.log(this)
},
이름 : '홍길동'
}
}
오브젝트.데이터.함수();
// 결과
// {이름: '홍길동', 함수: ƒ}
데이터를 중첩해서 넣어도 그 함수를 가지고 있는 Object를 뱉어낸다. 자 그렇다면, 1번에서 전역 공간에서 만드는 함수는 Window라는 Object에 보관한다고 하니, 3번 this의 뜻과 결국 똑같아진다. 바로, 그 함수를 가지고 있는 Object
를 뱉어내는 것이다.
함수를 new
키워드와 함께 생성자로 사용하면 this는 새로 생긴 객체에 묶인다.
function 오브젝트생성기계(){
this.이름 = '홍길동';
this.나이 = '32';
}
var 오브젝트 = new 오브젝트생성기계();
오브젝트;
// 결과
// 오브젝트생성기계 {이름: '홍길동', 나이: '32'}
addEventListener
함수를 사용할 때 this는 이벤트를 발사한 요소가 된다. 하단 예시를 보면 이해가 갈 것이다.
document.getElementById('버튼').addEventListener('click', function(event){
console.log(this);
console.log(event.currentTarget);
});
// 결과
// <button id="버튼">버튼</button> -> this
// <button id="버튼">버튼</button> -> event.currentTarget
콜백함수란 그냥 함수 안에 들어가는 함수라고 생각하면 된다. 순차적으로 실행하고 싶을 때 쓴다고 이해하면 쉽다.
document.getElementById('버튼').addEventListener('click', function(event){
var array = [1,2,3,4];
array.forEach(function(item){
console.log(this);
});
});
// 결과
// Window {parent: Window, opener: null, top: Window, length: 0 ...중략} x 4
Window {}
가 나오는 이유는 일반 함수에서는 Window {}
를 뱉어내기 때문이다. 여기서는 1번 this로 사용됐다.
var 오브젝트 = {
성씨: ['김', '이', '박'],
함수: function(){
오브젝트.성씨.forEach(function(){
console.log(this);
})
}
}
오브젝트.함수();
// 결과
// Window {0: Window, window: Window, self: Window, document: document, name: '' ...중략} x 3
Window {}
가 나오는 이유는 일반 함수에서는 Window {}
를 뱉어내기 때문이다. 여기서도 1번 this로 사용됐다. 그렇다면 한 발 더 나아가서, forEach문이 아닌 그 바깥에서 this를 선언한다면 그것의 this는 무엇일까?
var 오브젝트 = {
성씨: ['김', '이', '박'],
함수: function(){
console.log(this);
오브젝트.성씨.forEach(function(){
// console.log(this);
})
}
}
오브젝트.함수();
// 결과
// {성씨: Array(3), 함수: ƒ}
Object를 출력해주는 2번 this였다. 이런식으로 this값이 함수의 위치에 따라 마구 변하기 때문에 정신차려야 한다.
var 오브젝트 = {
성씨: ['김', '이', '박'],
함수: function(){
console.log(this);
오브젝트.성씨.forEach(() => {
console.log(this);
})
}
}
오브젝트.함수();
// 결과
// {성씨: Array(3), 함수: ƒ} x 4
화살표 함수는 내부의 this 값을 변화시키지 않고, 외부의 this값을 그~대로 재사용한다. 그래서 forEach문 바깥에서 선언된 this 값 그대로 사용되어 Object가 총 4번 출력된 것이다.