JavaScript ๋ฌธ๋ฒ• : this, Arrow Function

Kim Do-Heeยท2021๋…„ 6์›” 9์ผ
0

๐Ÿ“Ž JavaScript๋ฅผ ์“ฐ๋Š” ์ด์œ  : HTML์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Ž 'use strict'; (strict mode)

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ๋‹จ์— ์ž‘์„ฑํ•ด์ค€๋‹ค.

๐Ÿ“• this Keyword

<script>
	console.log(this); // ์ฝ˜์†”์ฐฝ์— this ํ‚ค์›Œ๋“œ ์ถœ๋ ฅ

	function printThis (){
    	console.log(this);
	}
	printThis(); // ์ฝ˜์†”์ฐฝ์— this ํ‚ค์›Œ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰
</script>

โœ”๏ธ this ๊ฐ’์€ window{...} ๋ผ๊ณ  ์ถœ๋ ฅ๋œ๋‹ค. ์ฆ‰, ๋‚˜๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” {object}๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
๐Ÿ“Ž window

  • ๋ชจ๋“  ์ „์—ญ๋ณ€์ˆ˜, ํ•จ์ˆ˜, DOM์„ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ „์—ญ๊ฐ์ฒด(์˜ค๋ธŒ์ ํŠธ)์ž…๋‹ˆ๋‹ค.
    ** ์ „์—ญ๋ณ€์ˆ˜ ๋ž€ ์ฝ”๋“œ ๋‚ด ๋ชจ๋“  ๊ณณ์—์„œ ์ฐธ์กฐํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์šฉ์ ์ธ, ๋ฒ”์œ„๊ฐ€ ๋„“์€ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

โœ”๏ธ strict mode์—์„œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด์—์„œ this๋ฅผ ์ถœ๋ ฅ์„ ์“ฐ๋ฉด undefined ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
โœ”๏ธ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋ฅผ <script></script> ์•ˆ์˜ ์ „์—ญ๊ณต๊ฐ„์—์„œ ๋งŒ๋“ค๋ฉด {window}๋ผ๋Š” ์ „์—ญ Object์— ๋ณด๊ด€๋œ๋‹ค.

<script>
  window: {
    ํ•จ์ˆ˜ () {
      console.log();
    }
  }
</script>

โœ”๏ธ Constructor(Object ์ƒ์„ฑ ๊ธฐ๊ณ„) ์•ˆ์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด instance(์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” object)๋ฅผ ๋œปํ•œ๋‹ค.

<script>

  function Machine(){ //constructor
    this.name = 'kim';
  }
  
  var newObject = new Machine(); //new object, instance
  
</script>

โœ”๏ธ this๋ฅผ addEventListener ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด e.currentTarget์™€ ๋™์ผํ•˜๊ฒŒ ์ง€๊ธˆ ์ด๋ฒคํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ณณ์„ ๋œปํ•œ๋‹ค.

<script>

  document.getElementById('btn').addEventListener('click', function(e){
    console.log(this); // id๊ฐ€ btn์ธ HTML
    console.log(e.currentTarget); // ์œ„์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ
  })
  
</script>

๐Ÿ”Ž CASE 1 : EventListener ์•ˆ์—์„œ Callback ํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค๋ฉด this๋Š”?

<script>

document.getElementById('btn').addEventListener('click', function(e){
  var newArray = [1,2,3];
  newArray.forEach(function(){
    console.log(this);
  });
});
  
</script>

ํ•จ์ˆ˜ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ์•ˆ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์—ญํ• ๋กœ ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค.
โœ”๏ธ forEach๋ผ๋Š” ํ•จ์ˆ˜ ์•ˆ์— function(){} ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
โœ”๏ธ ๊ฒฐ๊ณผ

Callback ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— {window} ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๐Ÿ”Ž CASE 2 : Object ์•ˆ์—์„œ Callback ํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค๋ฉด this๋Š”?

<script>

var newObject = {
  names : ['Kim', 'Lee', 'Park'];
  printThis : function(){
      newObject.names.forEach(function(){
        console.log(this)
      });
  }
}

</script>

โœ”๏ธ ๊ฒฐ๊ณผ

forEachํ•จ์ˆ˜ ์•ˆ์— Callback ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— {window} ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๐Ÿ”Ž CASE 3 : Object ์•ˆ์—์„œ Callback ํ•จ์ˆ˜๋ฅผ arrow function์œผ๋กœ ์“ด๋‹ค๋ฉด this๋Š”?

<script>

var newObject = {
  names : ['Kim', 'Lee', 'Park'];
  printThis : function(){
  	  console.log(this);
      newObject.names.forEach(() => {
        console.log(this)
      });
  }
}

</script>

โœ”๏ธ arrow function ํŠน์ง• : ๋‚ด๋ถ€์˜ this ๊ฐ’์„ ๋ณ€ํ™”์‹œํ‚ค์ง€ ์•Š๊ณ  ์™ธ๋ถ€ this ๊ฐ’ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ”๏ธ ๊ฒฐ๊ณผ

์ƒ์œ„ ์ฝ”๋“œ์˜ this๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ฌผ๋ ค๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— {names} ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๐Ÿ“— Arrow Function

๊ธฐ์กด ๋ฌธ๋ฒ• : function() {} โ†’ ์‹  ๋ฌธ๋ฒ• : () => {}
โœ”๏ธ ์‹ ๋ฌธ๋ฒ•์˜ ํŠน์ง•์€ this ๊ฐ’์„ ํ•จ์ˆ˜ ๋ฐ–์— ์žˆ๋˜๊ฑธ ๊ทธ๋Œ€๋กœ ์”€
โœ”๏ธ Object ๋‚ด this ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๊ธฐ์กด๋ฌธ๋ฒ•์—์„œ๋Š” ๊ทธ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” Object๊ฐ€ ์ถœ๋ ฅ๋จ
โœ”๏ธ Object ๋‚ด this ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ์‹ ๋ฌธ๋ฒ•์—์„œ๋Š” window{...} ๊ฐ€ ์ถœ๋ ฅ๋จ

profile
๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป(์†Œํ†ต, ์ฝ”๋”ฉ etc.) ์ž˜ ํ•˜๋Š” ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์—ฌ์ • :)

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