기본적으로 this는 나 자신을 담고있는 객체를 뜻한다!!
console.log(this)
혹은
function a(){
console.log(this)
}
a();
=> 콘솔 결과값 : window가 출력됨!
↓(global object)
함수나 변수를 전역공간에서 만들면 {window}에 보관하기 때문!
위 상황에서 window.a()를 해도 a함수가 실행된다.
let ob1 = {
name: bora
func: function(){
console.log(this)
}
}
ob1.func()
=> 콘솔 결과값 : { name:bora, func:f }
즉, 여기서 this는 이 함수가 포함되어있는 객체 자체를 뜻함
Arrow Function 으로 쓸 때let ob1 = {
name: "bora"
func: () => {
console.log(this)
}
}
ob1.func()
=> 콘솔 결과값 : window가 출력됨!!
Arrow Function은 기존 문법인 function(){}와 다르게 this값을 함수 밖에 있는 것, 즉 상위요소에서 그대로 가져와서 쓴다.
function cst(){
this.name = "bora"
}
=> 여기서의 this는 특이하게 새로 생성되는 오브젝트를 뜻함!
function cst(){
this.name = "bora"
}
let ob1 = new cst()
console.log(ob1)
=> 콘솔 결과값 : cst { name: 'bora' }
document.getElementById('btn').addEventListener('click', function(e){
console.log(this)
});
=> 콘솔 결과값 : <button id="btn">버튼</button>
여기서의 this는 e.currentTarget(이벤트가 동작하는 곳)을 의미한다! 즉 addEventListener가 부착된 HTML 요소임.
document.getElementById('버튼').addEventListener('click', function(e){
let arr = [1,2,3]
arr.forEach(function(){
console.log(this)
});
});
=> 콘솔 결과값 : window가 출력됨!!
forEach(콜백함수) 의 구조에서 이렇게 그대로 들어가 있는 콜백함수는 일반 함수와 같기 때문에 window가 출력됨
let obj1 = {
arr : ['A', 'B', 'C'];
func : function(){
name.func.forEach(function(){
console.log(this)
});
}
}
=> 콘솔 결과값 : window가 출력됨!!
달라보이지만 사실상 1번과 똑같이 콜백함수 그대로 쓰인 상황임.
위 2번과 똑같은 상황에서 Arrow Function으로 바꿔본다면?
let obj1 = {
arr : ['A', 'B', 'C'];
func : function(){
name.func.forEach(()=>{
console.log(this)
});
}
}
=> 콘솔 결과값 : { arr:['A', 'B', 'C'], func:f }
즉, 이 함수를 가지고있는 주인을 출력해준다.
Arrow Function은 내부의 this값을 변화시키지 않음!! 외부요소(부모)거 그대로 가져온다고 했음.
let obj1 = {
arr : ['A', 'B', 'C'];
func : function(){
console.log(this) // ←이거랑
name.func.forEach(()=>{ //둘이 같다는뜻임!
console.log(this) // ←이거랑
});
}
}