λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/JavaScript ES6

[JavaScript / ES6] this μ•Œμ•„λ³΄κΈ°

by Connecting-the-dots 2022. 4. 10.
728x90
λ°˜μ‘ν˜•

πŸ’‘ μ‹€μŠ΅ 포인트!

  • 이전에 κ°•μ‚¬λ‹˜μ˜ μˆ˜μ—…μ„ λ“€μœΌλ©΄μ„œ, 일반적인 ν˜•νƒœμ˜ function κ³Ό arrow function 이 μ™„μ „νžˆ 같은 것인 쀄 μ•Œκ³  λ¬΄μž‘μ • arrow function 으둜 λ§Œλ“€μ–΄μ„œ this λ₯Ό μ‚¬μš©ν•˜λ €λ‹€κ°€ μ›ν•˜λŠ” κΈ°λŠ₯이 μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ€ 적이 μžˆμ—ˆλ‹€.
  • κ·Έλž˜μ„œ 원인은 잘 λͺ¨λ₯Έ 채 일단 일반적인 ν˜•νƒœμ˜ function 으둜 μˆ˜μ •ν•΄μ£Όμ—ˆλŠ”λ° 이번 μˆ˜μ—…μ„ 톡해 this 에 λŒ€ν•΄ μ’€ 더 μ‹¬λ„μžˆκ²Œ 곡뢀할 수 μžˆμ—ˆλ‹€.

πŸ’œ this 1

this λ₯Ό κ·Έλƒ₯ μ‚¬μš©ν•˜κ±°λ‚˜, 일반 ν•¨μˆ˜ μ•ˆμ—μ„œ μ‚¬μš©ν•˜λ©΄ window λ₯Ό μ˜λ―Έν•œλ‹€.
ν•˜μ§€λ§Œ, 사싀상 μ „μ—­ κ³΅κ°„μ—μ„œ λ§Œλ“€λ©΄ this κ°€ μžˆλŠ” ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” object κ°€ window 인 κ²ƒμ΄λ―€λ‘œ, 2번과 λ™μΌν•˜λ‹€κ³  봐도 λ¬΄λ°©ν•˜λ‹€.

🀍 ex1.

console.log(this);  // this λŠ” window.

🀍 ex2.

function func2(){
      console.log(this);   
}

func2();  // this λŠ” 기본적으둜 window, strict mode μ—μ„œλŠ” undefined.

πŸ’œ this 2

object λ‚΄ ν•¨μˆ˜ μ•ˆμ—μ„œ this λ₯Ό μ‚¬μš©ν•˜λ©΄, this κ°€ μžˆλŠ” ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” object λ₯Ό μ˜λ―Έν•œλ‹€.

🀍 ex3.

let obj3 = {
    data3 : "Seoyun",
    func3 : function(){
    	console.log(this)
    }
}

obj3.func3(); // this κ°€ μžˆλŠ” func3() ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” object, 즉 μ—¬κΈ°μ„œλŠ” obj3 을 의미.

🀍 ex4.

let obj4 = {
    data4 : {
        func4 : function(){
            console.log(this);
        }
    }
}

obj4.data4.func4(); // this κ°€ μžˆλŠ” func4() ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” object, 즉 μ—¬κΈ°μ„œλŠ” data4 λ₯Ό 의미.

🀍 ex5.

let obj5 = {
    data5 : {
        func5_1 : ()=>{
        	console.log(this);
        },
        func5_2 : function(){
        	console.log(this);
        },
        func5_3(){
        	console.log(this);
        }
    }
}

obj5.data5.func5_1(); // arrow function 은 this 값을 ν•¨μˆ˜ λ°”κΉ₯μ—μ„œ κ·ΈλŒ€λ‘œ κ°€μ Έμ˜€λ―€λ‘œ, window λ₯Ό 의미.
obj5.data5.func5_2(); // this κ°€ μžˆλŠ” func5_2() ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” object, 즉 μ—¬κΈ°μ„œλŠ” data5 λ₯Ό 의미.
obj5.data5.func5_3(); // func5_2() ν•¨μˆ˜λŠ” func5_3() ν•¨μˆ˜μ²˜λŸΌ μ‚¬μš© κ°€λŠ₯.

🀍 ex6.

// ν•¨μˆ˜λ‚˜ λ³€μˆ˜λ₯Ό μ „μ—­κ³΅κ°„μ—μ„œ λ§Œλ“€λ©΄ { window } 에 보관.

function func6(){
	console.log(this);
}

func6();  // this λŠ” 기본적으둜 window, strict mode μ—μ„œλŠ” undefined.
window.func6();  // this λŠ” window.

πŸ’œ this 3

constructor ν•¨μˆ˜ μ•ˆμ—μ„œ this λ₯Ό μ‚¬μš©ν•˜λ©΄ μƒˆλ‘œ μƒμ„±λ˜λŠ” object λ₯Ό μ˜λ―Έν•œλ‹€.

🀍 ex7.

function constructor7(){
	this.name7 = 'Seoyun';
}

let obj7 = new constructor7();
obj7;  // {name7: 'Seoyun'} μ΄λΌλŠ” object 생성!

πŸ’œ this 4

eventListener μ•ˆμ—μ„œμ˜ this λŠ” event.currentTarget κ³Ό 동일

🀍 ex8.

<button id="btn">λ²„νŠΌ</button>

 

document.getElementById('btn').addEventListener('click', function(e){
    console.log(this);  // e.currentTarget κ³Ό λ™μΌν•˜κ²Œ btn νƒœκ·Έλ₯Ό 의미.
    console.log(e.currentTarget);  // btn νƒœκ·Έλ₯Ό 의미.

    let arr8 = [1, 2, 3];
    arr8.forEach(function(el){
        console.log(el);  // 1, 2, 3 이 순차적으둜 λ‚˜μ˜΄.
        console.log(this);  // this 1 에 ν•΄λ‹Ήν•˜λ―€λ‘œ this λŠ” window λ₯Ό 의미.
    })
})

πŸ’œ this 비ꡐ해보기

🀍 ex9.

let obj9 = {
    names9 : ['Seoyun', 'Suin', 'Inwoo'],
    func9 : function(){

        console.log(this);  //  this κ°€ μžˆλŠ” 읡λͺ…ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” object, 즉 μ—¬κΈ°μ„œλŠ” obj9 을 의미.

        obj9.names9.forEach(function(el){
            console.log(this);  // this κ°€ μžˆλŠ” 읡λͺ…ν•¨μˆ˜λŠ” κ·Έλƒ₯ μΌλ°˜ν•¨μˆ˜μ΄λ―€λ‘œ this λŠ” window λ₯Ό 의미.
        })

        obj9.names9.forEach((el)=>{
            console.log(this);  // arrow function 은 this 값을 ν•¨μˆ˜ λ°”κΉ₯μ—μ„œ κ·ΈλŒ€λ‘œ κ°€μ Έμ˜€λ―€λ‘œ, 즉 μ—¬κΈ°μ„œλŠ” obj9 을 의미.
        })

    }
}

obj9.func9();

 

728x90
λ°˜μ‘ν˜•