[๐Ÿฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] this

dsfasdยท2022๋…„ 10์›” 27์ผ
0

this ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž

this๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜ ์ด๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

(์ฐธ๊ณ ) strice mode์—์„  ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” undefined๋กœ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์š”์•ฝ! this๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด ๋‹ค๋ฅด๋‹ค.

์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด this -> window ๊ฐ์ฒด
๊ฐ์ฒด obj ๊ฐ’์˜ ํ•จ์ˆ˜ this -> ๊ฐ์ฒด obj๋ฅผ ์˜๋ฏธ
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€ this -> ์™ธ๋ถ€ this๊ฐ’ ์‚ฌ์šฉ
์ƒ์„ฑ์ž ๋‚ด์—์„œ this -> ๋‚ด ์ž์‹ 
์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ ๋‚ด this -> e.currnetTarget(์ด๋ฒคํŠธ ๋™์ž‘์ค‘์ธ ๊ณณ, ๋Œ€๋ถ€๋ถ„ ํƒœ๊ทธ)


1. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์“ฐ๋ฉด ์ „์—ญ ๊ฐ์ฒด {window}๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ์ž…์žฅ์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ตœ์ƒ๋‹จ ๊ฐ์ฒด์ธ window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

<script>
	console.log(this); //Window {0: global,... 
</script>
<script>
function func(){
    console.log(this); ////Window {0: global,... 
}
</script>

window ๊ฐ์ฒด๋ฅผ ํŽผ์ณ๋ณด๋ฉด window ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋“ค์„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


2. ์˜ค๋ธŒ์ ํŠธ ๋‚ด ํ•จ์ˆ˜์—์„œ ์“ฐ๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋œปํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ๋‚ด ํ•จ์ˆ˜ ์•ˆ์—์„œ ์“ฐ๋ฉด ( = func ๋ฉ”์„œ๋“œ์—์„œ this ์ถœ๋ ฅ )
๊ทธ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋œปํ•œ๋‹ค. ( = obj)

var obj = {
	name : 'me',
    func : function(){
      	console.log(this)
    }
}
obj.func(); // {name: 'me', func: ฦ’}

์•„๋ž˜์˜ ๊ฒฝ์šฐ func2 ๋ฉ”์„œ๋“œ์—์„œ this ์ถœ๋ ฅ์‹œ, this๋Š” func๋ฅผ ๋œปํ•จ

var obj = {
	name : 'me',
    func : {
    	func2 : function(){
          console.log(this)
        }
    }
}
obj.func.func2(); // {func2: ฦ’}


3. ์‹ ๋ฌธ๋ฒ• Arrow Function ํŠน์ง•: this๊ฐ’์„ ํ•จ์ˆ˜ ๋ฐ–์— ์žˆ๋˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๊ฐ’์€ ์™ธ๋ถ€ this ๊ฐ’์„ ๋ณ€ํ™”์‹œํ‚ค์ง€ ์•Š๊ณ  ์™ธ๋ถ€ this ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

console.log(this) // Window
var obj = {
	name : 'su',
    func : () => {
		console.log(this) // Window 
    }
}

obj.func();

์ฆ‰, 1๋ฒˆ ๊ฐœ๋…๊ณผ
2๋ฒˆ ๊ฐœ๋…์„ ์ข…ํ•ฉํ•ด์„œ ๋ดค์„ ๋•Œ this๋Š” ๋™์ผํ•œ ๊ฐœ๋…์ด๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ตœ์ƒ๋‹จ ๊ฐ์ฒด๊ฐ€ Window์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ ๊ณต๊ฐ„์—์„œ ๋งŒ๋“ค๋ฉด ๋ณด์ด์ง€ ์•Š๋Š” Window ๊ฐ์ฒด์— ๋ณด๊ด€ํ•œ๋‹ค.


4. ์ƒ์„ฑ์ž ๋‚ด์—์„œ ์‚ฌ์šฉ

function ๊ธฐ๊ณ„(){
	this.์ด๋ฆ„ = 'kim';
}

var newObj = new ๊ธฐ๊ณ„();
console.log(newObj); // construct{์ด๋ฆ„:'kim'}

5. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋‚ด this๋Š” e.currnetTarget ์˜๋ฏธ

e.currnetTarget์€ ์ง€๊ธˆ ์ด๋ฒคํŠธ ๋™์ž‘ํ•˜๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

<button id='๋ฒ„ํŠผ'>๋ฒ„ํŠผ</button>

document.getElementById('๋ฒ„ํŠผ').addEventListener('click',function(e){
	console.log(this);
  	console.log(e.currentTarget);
  
  // <button id='๋ฒ„ํŠผ'>๋ฒ„ํŠผ</button>
  // <button id='๋ฒ„ํŠผ'>๋ฒ„ํŠผ</button>
})

์ •๋ฆฌ ๊ฒธ ํ€ด์ฆˆ!

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋‚ด๋ถ€ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๋Š”?

<button id='๋ฒ„ํŠผ'>๋ฒ„ํŠผ</button>

  document.getElementById('๋ฒ„ํŠผ').addEventListener('click',function(e){
      var array = [1,2,3];
      array.forEach(function(a){
          console.log(this) 
      });
  })

์ •๋‹ต์€ Window ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
addEventListener ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์“ฐ์˜€์ง€๋งŒ
์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ ์“ด ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ ,
ํŠน์ • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์“ด ๊ฒƒ๋„ ์•„๋‹ˆ๋ฏ€๋กœ

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

์ด ํ•จ์ˆ˜๋Š” ์—„๋ฐ€ํžˆ ๋งํ•ด์„œ ์ „์—ญ ํ•จ์ˆ˜์— ํ•ด๋‹นํ•œ๋‹ค.


์˜ค๋ธŒ์ ํŠธ ๋‚ด์—์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค๋ฉด this๋Š”?

var obj = {
  ์ด๋ฆ„๋“ค :[ '๊น€','์ด','๋ฐ•'],
  ํ•จ์ˆ˜ : function(){
    console.log(this) // this
        obj.์ด๋ฆ„๋“ค.forEach(function(){console.log(this)}) }
    }

obj.ํ•จ์ˆ˜(); 
// Window 
// Window 
// Window 
obj.ํ•จ์ˆ˜(); 

๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด

function(){
	obj.์ด๋ฆ„๋“ค.forEach(function(){console.log(this)}) }
    }

์ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์‚ฌ์‹ค์ƒ ๊ทผ๋ณธ์—†๋Š”^^ ์ผ๋ฐ˜ ํ•จ์ˆ˜์— ํ•ด๋‹น๋œ๋‹ค. ์œ„ ์ผ€์ด์Šค๋ž‘ ๋งˆ์ฐฌ๊ฐ€์ง€.
๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต๋ฌธ์˜ ๊ธธ์ด๋งŒํผ window ๊ฐ์ฒด๊ฐ€ ์„ธ ๋ฒˆ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


arrow function ์•ˆ์—์„œ this?

var obj = {
  ์ด๋ฆ„๋“ค :[ '๊น€','์ด','๋ฐ•'],
  ํ•จ์ˆ˜ : function(){
    console.log(this) // (2) ์ด this๋ฅผ ์˜๋ฏธํ•จ
        obj.์ด๋ฆ„๋“ค.forEach(() =>{
          console.log(this)}) // (1) ์ด this๋Š”
  		}
    }

obj.ํ•จ์ˆ˜();

// {์ด๋ฆ„๋“ค:Array(3), ํ•จ์ˆ˜...}
// {์ด๋ฆ„๋“ค:Array(3), ํ•จ์ˆ˜...}
// {์ด๋ฆ„๋“ค:Array(3), ํ•จ์ˆ˜...}

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด this.innerHTML ๊ฐ’์„ 1์ดˆ ํ›„์— ์ถœ๋ ฅํ•˜๊ธฐ

(1) ์ผ๋ฐ˜ ํ•จ์ˆ˜์—์„œ this๊ฐ’์€ ๋ฐ”๋กœ ๊ทผ์ฒ˜์˜ function์„ ์ฐพ์•„๋ณด๋ฉด ๋œ๋‹ค.
์•„๋ž˜ this๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ผ๋ฐ˜ function์„ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ window๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์…ˆ์ด๋‹ค.

<button id="๋ฒ„ํŠผ">๋ฒ„ํŠผ์ด์—์š”</button>

<script>
  document.getElementById('๋ฒ„ํŠผ').addEventListener('click',function(){
  setTimeout(function(){console.log(this.innerHTML)},1000);
	}) // ์ด this๋Š” setTimeout ๋‚ด๋ถ€์— ์žˆ๋Š” this๊ฐ’, ์ฆ‰ ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ด๋‹ค. 
</script>

์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ–ˆ๋”๋ผ๋ฉด ๋ฐ–์— ์•„๋ฌด ์ƒ๊ด€์—†๋Š” window๊ฐ์ฒด์˜ innerHTML๊ฐ’์„ ๋ฐ›์•„์˜ค๋ฏ€๋กœ undefined๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.


(2) ํ•˜์ง€๋งŒ arrow function ํ˜•ํƒœ๋กœ ์ ๊ฒŒ๋˜๋ฉด ํ•จ์ˆ˜ ๋ฐ–์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ document.getElementById('๋ฒ„ํŠผ')์„ ์ œ๋Œ€๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

<button id="๋ฒ„ํŠผ">๋ฒ„ํŠผ์ด์—์š”</button>

<script>
  document.getElementById('๋ฒ„ํŠผ').addEventListener('click',function(){
  setTimeout(()=>{console.log(this.innerHTML)},1000);
	}) // ์ด this
</script>

(3) ํ˜น์€ this๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๋‹ค.

<button id="๋ฒ„ํŠผ">๋ฒ„ํŠผ์ด์—์š”</button>

<script>
  document.getElementById('๋ฒ„ํŠผ').addEventListener('click',function(){
  var ๋ฒ„ํŠผ = this;
  setTimeout(function(){console.log(๋ฒ„ํŠผ.innerHTML)},1000);
	})
</script>
profile
๊ธฐ๋ก์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„!

0๊ฐœ์˜ ๋Œ“๊ธ€