⭐️this keyword는 뜻이 여러개(3~4개) 있다.
1번 의미. 해당 함수를 담고 있는 상위 object
함수와 Object에서 사용할 때
2번 의미. instance
constructor에서 사용할 때
3번 의미. e.CurrentTarget
event listener에서 사용할 때
그냥 쓰거나 일반 함수 안에서 쓰면 window를 의미한다.
window
: 기본 함수들의 수납공간인 global object.
global object
: 전역변수 보관소
ex)
console.log(this)
ex)
function 함수명() {
console.log(this);
}
실행 결과 : window
함수나 변수를 전역공간에서 만들면 window object에 보관한다.
함수( )
== window.함수( )
=> 같은 의미!strict mode
일 때, 일반함수 내에서 쓰면 undefined를 의미한다.
자바스크립트 strict mode : 'use strict'
ex)
function 함수명() {
console.log(this);
}
실행 결과 : undefined
object 내 함수(= 메서드) 안에서 쓰면 그 함수를 가진 상위 object를 의미한다.
ex)
var obj = {
data : "kim",
func : function(){
console.log(this)
}
}
obj.func();
실행 결과 : {data: "kim", func : f}
⚠️ 유의 : 상위 o, 최상위 x
만약 object1 > object2 > function 일 때, function이 가리키는건 함수 바로 위에 있는 object2이다.
object 내 함수를 arrow function
으로 작성하면 함수 밖에 있던 this 값을 그대로 쓴다.
ex)
var obj = {
data : "kim",
func : () => {
console.log(this)
}
}
obj.func();
실행 결과 : 상위 this가 가지고 있는 this 값. (obj 안나옴)
arrow function 특징
내부의 this 값을 변화시키지 않는다.
외부 this값 그대로 "재사용" 가능!
var obj = {
data : "kim",
함수명(){
console.log(this)
}
}
constructor 안에서 쓰면 instance를 의미한다.
constructor
: 오브젝트를 반복해서 생성하는 기계
instance
: 새로 생성되는 object
ex)
function constructor() {
this.key = value // instance
}
참고 ) constructor 에서 오브젝트 생산하는 법
var 생산 = new constructor();
event listener 안에서 쓰면 e.currentTarget
을 의미한다.
e.currentTarget
: 지금 이벤트가 동작하는 곳
HTML
<button id="Btn"></button>
JS
document.getElementById('Btn').addEventListener('click',
function(e){
this; // == e.currentTarget
})
실행 결과 : <button id="Btn"></button>
document.getElementById('Btn').addEventListener('click',
function(e){
var arr = [1,2,3];
arr.forEach(function(a) {console.log(a)}) // console 창에 1, 2, 3 출력됨.
arr.forEach(function(a) {console.log(this)})
})
정답 : 1번 의미
forEach 내부 함수가 일반 함수이므로 window 출력됨.
var obj = {
name : ['김', '이', '박'],
함수 : function(){
console.log(this); // Q1
obj.name.forEach(function(){
console.log(this); // Q2
})
}
}
obj.함수();
정답 : Q1은 오브젝트 안의 함수에 this가 있으므로 2번 의미. 즉 obj를 출력한다. Q2는 forEach 내부 함수가 일반 함수이므로 1번 의미. 즉, window를 출력한다.
var obj = {
name : ['김', '이', '박'],
함수 : function(){
console.log(this); // Q1
obj.name.forEach(() =>
console.log(this); // Q2
)
}
}
obj.함수();
정답 : object 안의 함수에 arrow function을 쓰는 경우, 상위 this 값을 그대로 가져온다. 상위 this가 Q1이므로 Q1의 값인 obj를 출력한다.
출처 : 코딩애플 | 매우쉽게 이해하는 JavaScript 객체지향 & ES6 신문법