๐Ÿ“š Closure ๋ณต์Šต

Purpleยท2021๋…„ 11์›” 5์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
48/73

๐Ÿ“š Closure ๋ณต์Šต

  • ํด๋กœ์ €๋ž€ ์ด๋ฏธ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๋๋‚œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด
		function outer(){
          let num=0;
		  function inner(){
            num++;
            console.log(num)
          }
          return inner;
        }

์ด ํ•จ์ˆ˜๋ฅผ output์—์„œ ๋„ฃ๊ณ  // output=outer();
output()์„ ์ฝ˜์†”์— ์ฐ์œผ๋ฉด ์ž๋™์œผ๋กœ 1,2,3... ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • outer() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด inner ํ•จ์ˆ˜์—์„œ ๋ณ€์ˆ˜ x๊ฐ€ ์ž์‹ ์˜ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์•„๋‹˜์—๋„, outer() ํ•จ์ˆ˜์— ์ •์˜๋œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ์ด ๋•Œ inner() ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ํ•˜๋ฉฐ, outer() ํ•จ์ˆ˜์— ์ •์˜๋œ ๋ณ€์ˆ˜ x๋ฅผ ์ž์œ  ๋ณ€์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.
  • ํด๋กœ์ € ์ด๋ฆ„์˜ ์˜๋ฏธ๋Š” "์ž์œ  ๋ณ€์ˆ˜์— ๋‹ซํ˜€์žˆ๋‹ค", "์ž์œ  ๋ณ€์ˆ˜์— ์—ฎ์—ฌ์žˆ๋‹ค"๋Š” ์˜๋ฏธ์ด๋‹ค.

ํด๋กœ์ €๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

  • ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ, ํด๋กœ์ €๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
function count() {
    for (var i = 1; i < 10; i++) {
        setTimeout(function(){
            console.log(i);
        }, 1000);
    }
}

count();

๋ฅผ ์ฝ˜์†”์— ์ฐ์œผ๋ฉด 10์„ 9๋ฒˆ ์ถœ๋ ฅํ•œ๋‹ค.
์™œ๋ƒํ•˜๋ฉด countํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๋ฐ˜๋ณต๋ฌธ์„ ์ด 9๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ๋ฐ˜๋ณต๋ฌธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€์ˆ˜ i๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ , ์ปดํ“จํ„ฐ๋Š” ์—ฐ์‚ฐ ์†๋„๊ฐ€ ์—„์ฒญ๋‚˜๋ฏ€๋กœ setTimeout() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ 9๋ฒˆ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ 1์ดˆ๊ฐ€ ์•ˆ๊ฑธ๋ฆฐ๋‹ค.๊ทธ๋ž˜์„œ ์ฒ˜์Œ i === 1์ผ ๋•Œ 1์ดˆ ๋’ค์— ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ–ˆ๋˜ console.log(i)๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— i === 10์ด ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ 10์ด 9๋ฒˆ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ,

  • for ๋ฌธ์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ์„ var๊ฐ€ ์•„๋‹Œ let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • let์€ ๋ธ”๋ก ์Šค์ฝ”ํ”„( block scope )์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜๋ณต๋ฌธ์˜ ๊ฐ ๋‹จ๊ณ„๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜ i๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
function count() {
    for (let i = 1; i < 10; i++) {
        setTimeout(function(){
            console.log(i);
        }, 1000);
    }
}
count();

profile
๋‹ค์‹œ ๋ณด๋ฉด, ๋” ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋ณด์ธ๋‹ค.

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