๐Ÿ“– ํด๋กœ์ €

c_yjยท2022๋…„ 6์›” 29์ผ
0

DeepDive

๋ชฉ๋ก ๋ณด๊ธฐ
21/42
post-thumbnail

โœ”๏ธ ํด๋กœ์ €

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ์ด๋‹ค.
๐Ÿ˜ฐ ๋ฌด์Šจ ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์˜ˆ์ œ๋ฅผ ๋ด ๋ด…์‹œ๋‹ค.

const x = 1;

function outerFunc() {
  const x = 10;
  
  function innerFunc(){
    console.log(x); // 10
  }
  innerFunc();
}

outerFunc();

์ด ๊ฐ™์€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค

โœ”๏ธ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์— ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์ด๋ฅผ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(์ •์  ์Šค์ฝ”ํ”„)๋ผ ํ•œ๋‹ค.

โœ”๏ธ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]

ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ํ˜ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ๊ณผ๋Š” ์ƒ๊ด€์—†์ด ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ, ์ฆ‰ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ, ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ์ €์žฅ๋œ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ๊ฐ€ ๋ฐ”๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋‹ค. ๋˜ํ•œ ์ž์‹ ์ด ํ˜ธ์ถœ๋˜์—ˆ์„ ๋–„ ์ƒ์„ค๋  ํ•จ์ˆ˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ "์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ"์— ์ €์žฅ๋  ์ฐธ์กฐ๊ฐ’์ด๋‹ค. ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]์— ์ €์žฅํ•œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ, ์ฆ‰ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์ž์‹ ์ด ์กด์žฌํ•˜๋Š” ํ•œ ๊ธฐ์–ตํ•œ๋‹ค.

โœ”๏ธ ํด๋กœ์ €์™€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

const x = 1;

// 1
function outer() {
  const x = 10;
  const inner = function() {console.log(x);}; //2
  return inner;
}

// outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ค‘์ฒฉ ํ•จ์ˆ˜ inner๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
// ๊ทธ๋ฆฌ๊ณ  outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ํŒ๋˜์–ด ์ œ๊ฑฐ๋œ๋‹ค.
const innerFunc = outer()' // 3
innerFunc(); // 4 10
  • outerํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ3ํ•˜๋ฉด outer ํ•จ์ˆ˜๋Š” ์ค‘์ฒฉ ํ•จ์ˆ˜ inner๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋งˆ๊ฐ, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ
  • outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ x์™€ ๋ณ€์ˆ˜ ๊ฐ’ 10์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋˜ outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ x ๋˜ํ•œ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๋งˆ๊ฐ
    • outer ํ•จ์ˆ˜ ์ง€์—ญ ๋ณ€์ˆ˜ x๋Š” ์œ ํšจํ•˜์ง€์•Š๊ฒŒ ๋˜์–ด x ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์‚ฌ๋ผ์ง

์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ ์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ์ข…๋ฃŒํ•œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํด๋กœ์ €๋Š” ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ณ  ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ์— ํ•œ์ •ํ•˜๋Š”๊ฒƒ์ด ์ผ๋ฐ˜์ .

โœ”๏ธ ํด๋กœ์ €์˜ ํ™œ์šฉ

ํด๋กœ์ €๋Š” ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•œ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๋‹ค์‹œ ๋งํ•ด ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉ


const increase = (function () {
  // ์นด์šดํŠธ ์ƒํƒœ ๋ณ€์ˆ˜
  let num = 0;
  
  // ํด๋กœ์ €์ธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  // ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์€ ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
  // ๋”ฐ๋ผ์„œ ์•„๋ž˜ ๋ฉ”์„œ๋“œ๋“ค์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋‹ค
  return{
    // num:0, // ํ”„๋กœํผํ‹ฐ๋Š” publicํ•˜๋ฏ€๋กœ ์€๋‹‰๋˜์ง€ ์•Š๋Š”๋‹ค.
    increase() {
    return ++num;
  },
    // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค
    decrease() {
   	 return num > 0 ? --num : 0;
  }
 };
}());

console.log(increase()); // 1
console.log(increase()); // 2

console.log(decrease()); // 1
console.log(decrease()); // 0

ํด๋กœ์ €๋Š” ์ƒํƒœ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์•ˆ์ „ํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

๋ณ€์ˆ˜ ๊ฐ’์€ ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์–ด ์˜ค๋ฅ˜ ๋ฐœ์ƒ์˜ ๊ทผ๋ณธ์  ์›์ธ์ด๋œ๋‹ค. ์™ธ๋ถ€ ์ƒํƒœ ๋ณ€๊ฒฝ์ด๋‚˜ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ”ผํ•˜๊ณ  ๋ถˆ๋ณ€์…ฉ์„ ์ง€ํ–ฅํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ตœ๋Œ€ํ•œ ์–ต์ œํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํด๋กœ์ €๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ž

โœ”๏ธ ์บก์Šํ™”์™€ ์ •๋ณด ์€๋‹‰

์บก์Šํ™”๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ
์บก์Šํ™”๋Š” ๊ฐ์ฒด์˜ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ถœ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์ •๋ณด ์€๋‹‰์ด๋ผ ํ•œ๋‹ค.

  • ์ •๋ณด ์€๋‹‰์€ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ตฌํ˜„์˜ ์ผ๋ถ€๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜์ง€ ์•Š๋„๋ก ๊ฐ์ถ”์–ด ์ ์ ˆ์น˜ ๋ชปํ•œ ์ ‘๊ทผ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒจ์˜ค๋””๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด ์ •๋ณด๋กค ๋ณดํ˜ธ
  • ๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ ์˜์กด์„ฑ, ์ฆ‰ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค

โœ”๏ธ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜

โŒ ์ž์ฃผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์žฌ

var funcs = [];

for (var i = 0; i < 3; i++){
  funcs[i] = function () { return i; }; // 1
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]()); // 2
  • ์ฒซ ๋ฒˆ์งธ for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด(1)์—์„œ ํ•จ์ˆ˜๊ฐ€ funcs ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด(2)์—์„œ funcs ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ ํ•จ์ˆ˜๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ
  • funcs ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ 3๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ 0,1,2๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ XXXXXX

for๋ฌธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ i ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ธฐ๋–„๋ฌธ์— ์ „์—ญ ๋ณ€์ˆ˜๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜ i์—๋Š” 0,1,2๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ• ๋‹น๋œ๋‹ค. ๋”ฐ๋ผ์„œ funcs ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ „์—ญ ๋ณ€์ˆ˜ i๋ฅผ ์ฐธ์กฐํ•˜์—ฌ i์˜ ๊ฐ’ 3์ด ๋‚˜์˜จ๋‹ค.

โญ•๏ธ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ณ ์ณ๋ณด์ž

var funcs = [];

for (var i = 0; i < 3; i++){
  funcs[i] (function (id) { // 1
    return function () {
      return id;
    };
  }(i));
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]());
}

๐Ÿ˜… ๋งˆ์น˜๋ฉฐ,,,,,,,,
ํด๋กœ์ €๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์™œ ์“ฐ๋Š”์ง€๋Š” ์ •ํ™•ํžˆ ์•Œ๊ฒ ์ง€๋งŒ, ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋” ๋ฐฐ์šฐ๊ณ  ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

profile
FrontEnd Developer

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