๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“™Diary

ํด๋กœ์ €์™€ ์Šค์ฝ”ํ”„์ฒด์ธ์˜ ์ดํ•ด๋ฅผ ์œ„ํ•œ ์ฃผ์ ˆ๊ฑฐ๋ฆผ

by ๋…น์ฐจ๋ง›๊ฐœ๊ตฌ๋ฆฌ 2022. 11. 9.

์ƒ๊ฐ..

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ํ™˜๊ฒฝ์„ ๋”ฐ๋ฅธ๋‹ค๋Š”๊ฑด ์•Œ๊ณ ์žˆ๊ณ 

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ํ™˜๊ฒฝ ์ฆ‰, ์ •์  ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด์•„๋‹Œ ์„ ์–ธ์— ์˜ํ•ด์„œ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค

๋ ‰์‹œ์ปฌ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์žฅ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์ด๋‹ค.

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„( ๋™์  ์Šค์ฝ”ํ”„ )

var x = "global";

function outer() {
  var x = "local";
  inner();
}

function inner() {
  console.log(x);
}

outer() //global
inner() //global

์•„๋ž˜์™€ ๊ฐ™์ด ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜์ด๋ฉด ์ƒ๋‹จ์˜ ์™ธ๋ถ€ํ•จ์ˆ˜๋กœ ์˜ฌ๋ผ๊ฐ€ ์ฐพ๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์ „์—ญ๋ณ€์ˆ˜ ๋ฒ”์œ„๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€์„œ๋„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

๋™์  ์Šค์ฝ”ํ”„

var x = "global";

function outer() {
  var x = "local";
  inner();
}

function inner() {
  console.log(x);
}

outer() //local
inner() //global

๋™์  ์Šค์ฝ”ํ”„๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์™€ ๋‹ค๋ฅด๊ฒŒ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์— ๋”ฐ๋ผ ๋ฒ”์œ„๋ฅผ ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— outer()ํ•จ์ˆ˜์•ˆ์—์„œ ํ˜ธ์ถœ๋œ inner()๋Š”

inner()ํ•จ์ˆ˜์•ˆ์—๋Š” x๊ฐ€ ์—†๊ธฐ์— ํ˜ธ์ถœ๋œ ์ž๋ฆฌ์—์„œ ํ•œ๋ฒˆ ์˜ฌ๋ผ๊ฐ€์„œ var x = "local"์„ ๋งŒ๋‚˜ x๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ฒŒ๋˜๋ฉฐ

local์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ๋‹ค.

 

 

๊ทธ๋ž˜์„œ

ํด๋กœ์ €ํ•จ์ˆ˜๋ฅผ ์ดํ•ดํ• ๋•Œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ์˜ํ•ด ํ•จ์ˆ˜์•ˆ์— ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ 

ํด๋กœ์ €

์ด๋ฏธ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋๋‚œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜

function outerFunc() {
	var x = 10;
	var innerFunc = function () {console.log(x);}
	return innerFunc();
}

var inner = outerFunc();
inner();
  1. ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  2. ๋ณ€์ˆ˜๊ฐ์ฒด์˜ inner, outerFunc๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , scope๋Š” ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.
  3. inner() - outerFunc()๊ฐ€ ์‹คํ–‰๋จ์— ๋”ฐ๋ผ, outerFunc()์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  4. outerFunc() ์•ˆ์˜ ๋ณ€์ˆ˜ x, innerFunc๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , scope๋Š” outerFunc ๋ณ€์ˆ˜๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.
  5. outerFunc()๊ฐ€ innerFunc๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๋ฆฌํ„ดํ•œ๋‹ค.

  1. innerFunc() ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  2. innerFunc()์˜ scope๋Š” innerFunc์•ˆ์— ๋ณ€์ˆ˜๊ฐ์ฒด๊ฐ€ ์—†์Œ์— ๋”ฐ๋ผ, outerFunc์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
  3. ์ด์—๋”ฐ๋ผ, innerFunc()์˜ scope๋Š” outerFunc()๊ฐ€ ๋œ๋‹ค.

outerFunc() ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒ๋์ง€๋งŒ, innerFunc()์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๋Š” ์œ ์ง€๋˜๊ณ  ์žˆ๋‹ค.

 

var c = 4;

function outer() {
  var a = 1;
  var b = 3;

  return function inner() {
    var a = 2;
    console.log(b); // 3
  }
}

var someFunc = outer();
someFunc();
  • outer ํ•จ์ˆ˜๋Š” inner ํ•จ์ˆ˜๋ฅผ return ํ•˜๊ณ  ์žˆ๊ณ  someFunc์—๋Š” outer ํ•จ์ˆ˜์˜ ์‹คํ–‰๊ฒฐ๊ณผ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— inner ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, var someFunc = outer(); ์—์„œ outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด outer ํ•จ์ˆ˜ ๋‚ด ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์€ ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค. ๋ช‡๋ช‡ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ํ•จ์ˆ˜ ์•ˆ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ์—๋งŒ ์กด์žฌํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํด๋กœ์ €๋ฅผ ํ˜•์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์–ดํœ˜์  ํ™˜๊ฒฝ์˜ ์กฐํ•ฉ์ด๋‹ค. ์ด ํ™˜๊ฒฝ์€ ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ์ ์˜ ์œ ํšจ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • someFunc๋Š” outer์ด ์‹คํ–‰๋  ๋•Œ ์ƒ์„ฑ๋œ inner ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋‹ค. inner์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€์ˆ˜ b๊ฐ€ ์žˆ๋Š” ์–ดํœ˜์  ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ someFunc๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ b๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๋‚จ๊ฒŒ๋œ๋‹ค.
  • ์ฆ‰, ์›๋ž˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด ์‚ฌ๋ผ์ง€์ง€๋งŒ, ํด๋กœ์ €๊ฐ€ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๊ณ„์† ๋“ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ outer ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿผ ์ด๋Ÿฌํ•œ ํด๋กœ์ €๋Š” ์–ด๋””์— ์จ๋จน์„ ์ˆ˜ ์žˆ์„๊นŒ?

 

ํ•จ์ˆ˜์˜ ์บก์Šํ™”

๋งŒ์•ฝ ์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„๋•Œ, ์ด ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์ „์—ญ๋ณ€์ˆ˜ age๋ฅผ ํ™œ์šฉํ•ด ํ•ด๋‹น Person๊ฐ์ฒด์˜ BrotherAge๋ฅผ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

var age = 13
var Person = function (){
        var myBrotherAge = age - 5
        console.log(myBrotherAge)
}
Person()

์œ„์™€ ๊ฐ™์ด ์ „์—ญ๋ณ€์ˆ˜ age๋ฅผ Person๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž.

 

var Person = (function (){
    var age = 13
    return (function(){
        var myBrotherAge = age - 5
        console.log(myBrotherAge)
    })
})()
Person()

์ด๋•Œ ์œ„์™€ ๊ฐ™์ด ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” ์ „์—ญ๋ณ€์ˆ˜ age๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์–ด์ง„๋‹ค. ์™ธ๋ถ€์—์„œ Person๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•ด๋ด๋„ ํด๋กœ์ €ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ๋•Œ๋ฌธ์— age๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. 

๋ฃจํ”„์•ˆ์—์„œ์˜ ํด๋กœ์ € ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์  ( ์ดํ•ด์™€ ๊ณต๋ถ€๊ฐ€ ๋” ํ•„์š”  )

function countSeconds(howMany) {
  for (var i =1; i <= howMany; i++) {
    setTimeout(function () {
      console.log(i);
    }, i * 1000 );
  }
};
countSeconds(10)

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์„๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜์˜ฌ๊ฒƒ ๊ฐ™์€๊ฐ€?

์ž์นซ ์ฐํžˆ๋Š” ๋กœ๊ทธ๊ฐ€ 1~11๊นŒ์ง€ 1์ดˆ๋งˆ๋‹ค ์ฐํžŒ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ์œ„์˜ ๊ฒฐ๊ณผ๋Š” 11์ด 1์ดˆ์— ํ•œ๋ฒˆ์”ฉ 10๋ฒˆ ์ฐํžŒ๋‹ค.

์ฒซ๋ฒˆ์งธ SetTimeout์˜ ํ•จ์ˆ˜๊ฐ€  ์‹คํ–‰๋˜๊ธฐ์ „์— ๋ฃจํ”„๋ฌธ์ด ๋๋‚˜๊ฒŒ ๋˜๋ฉฐ, ๋ฃจํ”„๋ฌธ์— ๋”ฐ๋ผ ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ ์‹œ๊ฐ„ ๋งค๊ฐœ๋ณ€์ˆ˜์—” i๊ฐ’์ด ์ฐจ๋ก€๋กœ ๋“ค์–ด๊ฐ€์ง€๋งŒ ์ดํ›„์— setTimeout๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” i๋Š” ์ด๋ฏธ howMany๋งŒํผ ์ฆ๊ฐ€ํ•œ i๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฏธ ๋‹ซํžŒ setTImeoutํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ ์ต๋ช…ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€์˜ i๋ฅผ ๊ณ„์† ์ถ”์ ํ•˜๊ธฐ์— ์ƒ๊ธฐ๋Š” ๊ฒฐ๊ณผ์ธ ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ 10์ดˆ ๋™์•ˆ 1๋ถ€ํ„ฐ 11๊นŒ์ง€ ๋กœ๊ทธ๋ฅผ ์ฐ๊ณ ์‹ถ๋‹ค๋ฉด setTimeout๋ฐ–์— ํ•จ์ˆ˜ํ•˜๋‚˜๋ฅผ ๋ง์”Œ์šด ํ›„ i๊ฐ’์„ ๋ณต์ œํ•ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

function countSeconds(howMany) {
  for (var i =1; i <= howMany; i++) {
    var count = function (current){
        setTimeout(function () {
      console.log(current);
    }, i * 1000 );
  }
  count(i)
    }
    
};
countSeconds(10)

์ด๋Ÿฌ๋ฉด ๋‚ด๋ถ€ ํด๋กœ์ € ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์€ ๊ณ„์† ๋ณ€ํ•˜๋Š” i๊ฐ€ ์•„๋‹Œ ๊ณ ์ •๊ฐ’ current๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

728x90