This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

ํด๋กœ์ €

ํด๋กœ์ €๋Š” ์ฃผ๋ณ€ ์ƒํƒœ(์–ดํœ˜์  ํ™˜๊ฒฝ)์— ๋Œ€ํ•œ ์ฐธ์กฐ์™€ ํ•จ๊ป˜ ๋ฌถ์ธ(ํฌํ•จ๋œ) ํ•จ์ˆ˜์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํด๋กœ์ €๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. JavaScript์—์„œ ํด๋กœ์ €๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ ์‹œ ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์–ดํœ˜์  ๋ฒ”์œ„ ์ง€์ •(Lexical scoping)

๋‹ค์Œ์„ ๊ณ ๋ คํ•ด ๋ด…์‹œ๋‹ค.

js
function init() {
  var name = "Mozilla"; // name์€ init์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.
  function displayName() {
    // displayName() ์€ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ด๋ฉฐ, ํด๋กœ์ €๋‹ค.
    console.log(name); // ๋ถ€๋ชจ ํ•จ์ˆ˜์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  }
  displayName();
}
init();

init()์€ ์ง€์—ญ ๋ณ€์ˆ˜ name๊ณผ ํ•จ์ˆ˜ displayName()์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. displayName()์€ init() ์•ˆ์— ์ •์˜๋œ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ด๋ฉฐ init() ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ displayName() ๋‚ด๋ถ€์—” ์ž์‹ ๋งŒ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, displayName() ์—ญ์‹œ ๋ถ€๋ชจ ํ•จ์ˆ˜ init()์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ name์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด JSFiddle ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  displayName() ํ•จ์ˆ˜ ๋‚ด์˜ console.log() ๋ฌธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋ถ€๋ชจ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ name ๊ฐ’์„ ํ‘œ์‹œํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋  ๋•Œ ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๊ฐ€ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” '์ •์  ์Šค์ฝ”ํ”„'์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ '์ •์ '์ด๋ž€, ์ •์  ๋ฒ”์œ„ ์ง€์ • ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋””์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์†Œ์Šค์ฝ”๋“œ ๋‚ด ์–ด๋””์—์„œ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€ ๊ณ ๋ คํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ๋‹จ์–ด '์ •์ '์€ ์ด๋Ÿฐ ์‚ฌ์‹ค์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ๋ฒ”์œ„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŠน์ • ์˜ˆ์‹œ์—์„œ, ๋ฒ”์œ„๋Š” "ํ•จ์ˆ˜ ๋ฒ”์œ„"๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ•จ์ˆ˜ ๋ณธ๋ฌธ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

let๊ณผ const๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒ”์œ„ ์ง€์ •

(ES6 ์ด์ „) ์ „ํ†ต์ ์ธ JavaScript์—๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์™€ ์ „์—ญ ์Šค์ฝ”ํ”„ ๋‘ ๊ฐ€์ง€๋งŒ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€์—์„œ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋˜๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ์ค‘๊ด„ํ˜ธ๋กœ ํ‘œ์‹œ๋œ ๋ธ”๋ก์ด ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
if (Math.random() > 0.5) {
  var x = 1;
} else {
  var x = 2;
}
console.log(x);

C๋‚˜ Java์™€ ๊ฐ™์ด ๋ธ”๋ก์ด ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์–ธ์–ด์˜ ๊ฒฝ์šฐ, ์œ„ ์ฝ”๋“œ์˜ console.log ๋ผ์ธ์—์„œ x๊ฐ€ ์–ด๋–ค ๋ธ”๋ก ์Šค์ฝ”ํ”„์—๋„ ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋ธ”๋ก์€ var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๊ธฐ์„œ var ๋ช…๋ น๋ฌธ์€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํด๋กœ์ €์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์–ด๋–ค ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‹ค์ œ ์˜ˆ์ œ๊ฐ€ ์•„๋ž˜ ์†Œ๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ES6์—์„œ, JavaScript๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก let๊ณผ const ์„ ์–ธ๊ณผ ํ•จ๊ป˜ ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€ ๋“ฑ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

js
if (Math.random() > 0.5) {
  const x = 1;
} else {
  const x = 2;
}
console.log(x); // ์ฐธ์กฐ ์—๋Ÿฌ: x๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ES6๋ถ€ํ„ฐ ๋ธ”๋ก์€ ์Šค์ฝ”ํ”„๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ์ด๋Š” let๊ณผ const๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ์„ ๋•Œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ES6์—์„œ ๋ชจ๋“ˆ์„ ๋„์ž…ํ•˜๋ฉด์„œ ๋˜ ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”ํ›„ ์†Œ๊ฐœํ•˜๊ฒ ์ง€๋งŒ, ํด๋กœ์ €๋Š” ์ด ๋ชจ๋“  ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ €(Closure)

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

js
function makeFunc() {
  const name = "Mozilla";
  function displayName() {
    console.log(name);
  }
  return displayName;
}

const myFunc = makeFunc();
myFunc();

์ด ์ฝ”๋“œ๋Š” ์ „ ์˜ˆ์ œ์˜ init() ํ•จ์ˆ˜์™€ ์™„์ „ํžˆ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ (๊ทธ๋ฆฌ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ )์€ displayName() ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์™ธ๋ถ€ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

ํ•œ๋ˆˆ์— ๋ด์„œ๋Š”, ์ด ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์ง๊ด€์ ์œผ๋กœ ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ, ํ•จ์ˆ˜ ์•ˆ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ์—๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. makeFunc() ์‹คํ–‰์ด ๋๋‚˜๋ฉด, name ๋ณ€์ˆ˜์— ๋” ์ด์ƒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— JavaScript์—์„œ๋Š” ๋ถ„๋ช…ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” JavaScript์˜ ํ•จ์ˆ˜๊ฐ€ ํด๋กœ์ €๋ฅผ ํ˜•์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์–ดํœ˜์  ํ™˜๊ฒฝ์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค. ์ด ํ™˜๊ฒฝ์€ ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ์ ์˜ ์œ ํšจ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ, myFunc์€ makeFunc์ด ์‹คํ–‰ ๋  ๋•Œ ์ƒ์„ฑ๋œ displayName ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. displayName์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€์ˆ˜ name ์ด ์žˆ๋Š” ์–ดํœ˜์  ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ, myFunc๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ณ€์ˆ˜ name์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๋‚จ๊ฒŒ ๋˜๊ณ  "Mozilla" ๊ฐ€ console.log ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์กฐ๊ธˆ ๋” ํฅ๋ฏธ๋กœ์šด ์˜ˆ์ œ์ธ makeAdder ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

js
function makeAdder(x) {
  return function (y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
const add10 = makeAdder(10);

console.log(add5(2)); // 7
console.log(add10(2)); // 12

์ด ์˜ˆ์ œ์—์„œ, ๋‹จ์ผ ์ธ์ž x๋ฅผ ๋ฐ›์•„์„œ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ makeAdder(x)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋˜๋Š” ํ•จ์ˆ˜๋Š” ๋‹จ์ผ์ธ์ž y๋ฅผ ๋ฐ›์•„์„œ x์™€ y์˜ ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ, makeAdder๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํŒฉํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด๋Š” makeAdderํ•จ์ˆ˜๊ฐ€ ํŠน์ •ํ•œ ๊ฐ’์„ ์ธ์ž๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ๋ฆฌํ„ดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์—์„œ, ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ๋Š” ์ธ์ž์— 5์™€ 10์„ ๋”ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค์–ด ๋ƒ…๋‹ˆ๋‹ค.

add5์™€ add10์€ ๋‘˜ ๋‹ค ํด๋กœ์ €์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ๊ฐ™์€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ ์ •์˜๋ฅผ ๊ณต์œ ํ•˜์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ๋งฅ๋ฝ(์–ดํœ˜)์  ํ™˜๊ฒฝ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ add5์˜ ์–ดํœ˜์  ํ™˜๊ฒฝ์—์„œ, ํด๋กœ์ € ๋‚ด๋ถ€์˜ x๋Š” 5 ์ด์ง€๋งŒ, add10์˜ ๋งฅ๋ฝ์  ํ™˜๊ฒฝ์—์„œ x๋Š” 10์ž…๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ ํด๋กœ์ €

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

๊ฒฐ๋ก ์ ์œผ๋กœ, ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณณ์— ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์€ ํŠนํžˆ ์›น์—์„œ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ JavaScript์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๋Š” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋™์ž‘์„ ์ •์˜ํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž์— ์˜ํ•œ ์ด๋ฒคํŠธ(ํด๋ฆญ ํ˜น์€ ํ‚ค ๋ˆ„๋ฅด๊ธฐ ๊ฐ™์€)์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝœ๋ฐฑ(์ด๋ฒคํŠธ์— ์‘๋‹ตํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ๋‹จ์ผ ํ•จ์ˆ˜)์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ํŽ˜์ด์ง€์˜ ๊ธ€์ž ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ช‡ ๊ฐœ์˜ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ body ์š”์†Œ์˜ font-size๋ฅผ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์ง€์ •ํ•˜๊ณ  ์ƒ๋Œ€์ ์ธ em ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ์š”์†Œ(์˜ˆ: ํ—ค๋”)์˜ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

css
body {
  font-family: Helvetica, Arial, sans-serif;
  font-size: 12px;
}

h1 {
  font-size: 1.5em;
}

h2 {
  font-size: 1.2em;
}

์šฐ๋ฆฌ์˜ ๋Œ€ํ™”์‹ ๊ธ€์ž ํฌ๊ธฐ ๋ฒ„ํŠผ๋“ค์€ body ์š”์†Œ์˜ font-size ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ์กฐ์ •์€ ์ƒ๋Œ€์  ๋‹จ์œ„๋“ค ๋•๋ถ„์— ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ์š”์†Œ์— ์˜ํ•ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ JavaScript ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

js
function makeSizer(size) {
  return function () {
    document.body.style.fontSize = `${size}px`;
  };
}

const size12 = makeSizer(12);
const size14 = makeSizer(14);
const size16 = makeSizer(16);

size12, size14, size16์€ body ์š”์†Œ์˜ ๊ธ€์ž ํฌ๊ธฐ๋ฅผ ๊ฐ๊ฐ 12, 14, 16 ํ”ฝ์…€๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋“ค์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฒ„ํŠผ๋“ค์—(์ด ๊ฒฝ์šฐ์—๋Š” ํ•˜์ดํผ๋งํฌ) ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
document.getElementById("size-12").onclick = size12;
document.getElementById("size-14").onclick = size14;
document.getElementById("size-16").onclick = size16;
html
<a href="#" id="size-12">12</a>
<a href="#" id="size-14">14</a>
<a href="#" id="size-16">16</a>

JSFiddle์„ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”.

ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด์„œ ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ (private method) ํ‰๋‚ด๋‚ด๊ธฐ

์ž๋ฐ”์™€ ๊ฐ™์€ ๋ช‡๋ช‡ ์–ธ์–ด๋“ค์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ๋งŒ ๊ทธ ๋ฉ”์„œ๋“œ๋“ค์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

classes ์ด์ „์˜ JavaScript์—๋Š” ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์ง€๋งŒ, ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ํ‰๋‚ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋ฐ๋งŒ ์œ ์šฉํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์ „์—ญ ์ด๋ฆ„ ๊ณต๊ฐ„์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋น„๊ณต๊ฐœ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ํผ๋ธ”๋ฆญ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋“ˆ ๋””์ž์ธ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

js
const counter = (function () {
  let privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }

  return {
    increment() {
      changeBy(1);
    },

    decrement() {
      changeBy(-1);
    },

    value() {
      return privateCounter;
    },
  };
})();

console.log(counter.value()); // 0.

counter.increment();
counter.increment();
console.log(counter.value()); // 2.

counter.decrement();
console.log(counter.value()); // 1.

์ด์ „ ์˜ˆ์ œ์—์„œ, ๊ฐ ํด๋กœ์ €๋“ค์ด ๊ณ ์œ ํ•œ ์–ดํœ˜์  ํ™˜๊ฒฝ์„ ๊ฐ€์กŒ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” counter.increment, counter.decrement, counter.value ์„ธ ํ•จ์ˆ˜์— ์˜ํ•ด ๊ณต์œ ๋˜๋Š” ํ•˜๋‚˜์˜ ์–ดํœ˜์  ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

๊ณต์œ ๋˜๋Š” ์–ดํœ˜์  ํ™˜๊ฒฝ์€ ์‹คํ–‰๋˜๋Š” ์ต๋ช… ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์ด ์ต๋ช… ํ•จ์ˆ˜๋Š” ์ •์˜๋˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(IIFE๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด ์–ดํœ˜์  ํ™˜๊ฒฝ์€ ๋‘ ๊ฐœ์˜ ๋น„๊ณต๊ฐœ ํ•ญ๋ชฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” privateCounter๋ผ๋Š” ๋ณ€์ˆ˜์ด๊ณ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” changeBy๋ผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ต๋ช… ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ๋  ์ˆ˜ ์—†๋Š” ๋น„๊ณต๊ฐœ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ์ต๋ช… ๋ž˜ํผ์—์„œ ๋ฐ˜ํ™˜๋œ ์„ธ ๊ฐœ์˜ ๊ณต๊ฐœ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์„ธ ๊ฐ€์ง€ ๊ณต๊ฐœ ํ•จ์ˆ˜๋Š” ๊ฐ™์€ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ํด๋กœ์ €์ž…๋‹ˆ๋‹ค. JavaScript์˜ ์–ดํœ˜์  ์œ ํšจ ๋ฒ”์œ„ ๋•๋ถ„์—, ์„ธ ํ•จ์ˆ˜ ๊ฐ๊ฐ privateCounter ๋ณ€์ˆ˜์™€ changeBy ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
const makeCounter = function () {
  let privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment() {
      changeBy(1);
    },

    decrement() {
      changeBy(-1);
    },

    value() {
      return privateCounter;
    },
  };
};

const counter1 = makeCounter();
const counter2 = makeCounter();

console.log(counter1.value()); // 0.

counter1.increment();
counter1.increment();
console.log(counter1.value()); // 2.

counter1.decrement();
console.log(counter1.value()); // 1.
console.log(counter2.value()); // 0.

๋‘ ์นด์šดํ„ฐ๊ฐ€ ์„œ๋กœ ๋…๋ฆฝ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ๊ฐ ํด๋กœ์ €๋Š” ์ž์ฒด ํด๋กœ์ €๋ฅผ ํ†ตํ•ด privateCounter ๋ณ€์ˆ˜์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์นด์šดํ„ฐ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค, ์ด ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์–ดํœ˜ ํ™˜๊ฒฝ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํด๋กœ์ €์—์„œ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ๋‹ค๋ฅธ ํด๋กœ์ €์˜ ๊ฐ’์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ •๋ณด ์€๋‹‰๊ณผ ์บก์Аํ™” ๊ฐ™์€ ์ด์ ๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ € ์Šค์ฝ”ํ”„ ์ฒด์ธ

๋ชจ๋“  ํด๋กœ์ €์—๋Š” ์„ธ๊ฐ€์ง€ ์Šค์ฝ”ํ”„(๋ฒ”์œ„)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ง€์—ญ ๋ฒ”์œ„ (Local Scope, Own scope)
  • ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ฒ”์œ„ (๋ธ”๋ก, ํ•จ์ˆ˜ ๋˜๋Š” ๋ชจ๋“ˆ ๋ฒ”์œ„์ผ ์ˆ˜ ์žˆ์Œ)
  • ์ „์—ญ ๋ฒ”์œ„ (Global Scope)

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

js
// ์ „์—ญ ๋ฒ”์œ„ (global scope)
const e = 10;
function sum(a) {
  return function (b) {
    return function (c) {
      // ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ฒ”์œ„ (outer functions scope)
      return function (d) {
        // ์ง€์—ญ ๋ฒ”์œ„ (local scope)
        return a + b + c + d + e;
      };
    };
  };
}

console.log(sum(1)(2)(3)(4)); // 20

์ต๋ช… ํ•จ์ˆ˜ ์—†์ด ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

js
// ์ „์—ญ ๋ฒ”์œ„ (global scope)
const e = 10;
function sum(a) {
  return function sum2(b) {
    return function sum3(c) {
      // ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ฒ”์œ„ (outer functions scope)
      return function sum4(d) {
        // ์ง€์—ญ ๋ฒ”์œ„ (local scope)
        return a + b + c + d + e;
      };
    };
  };
}

const sum2 = sum(1);
const sum3 = sum2(2);
const sum4 = sum3(3);
const result = sum4(4);
console.log(result); // 20

์œ„์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด, ์ผ๋ จ์˜ ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋“ค์€ ์ „๋ถ€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ฒ”์œ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ๋งฅ์—์„œ๋Š” ํด๋กœ์ €๊ฐ€ ์„ ์–ธ๋œ "๋ชจ๋“ " ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ €๋Š” ๋ธ”๋ก ๋ฒ”์œ„์™€ ๋ชจ๋“ˆ ๋ฒ”์œ„์—์„œ๋„ ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ ๋ธ”๋ก ๋ฒ”์œ„ ๋ณ€์ˆ˜ y์— ๋Œ€ํ•œ ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

js
function outer() {
  let getY;
  {
    const y = 6;
    getY = () => y;
  }
  console.log(typeof y); // undefined
  console.log(getY()); // 6
}

outer();

๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํด๋กœ์ €๋Š” ๋”์šฑ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.

js
// myModule.js
let x = 5;
export const getX = () => x;
export const setX = (val) => {
  x = val;
};

์—ฌ๊ธฐ์—์„œ, ๋ชจ๋“ˆ์€ ๋ชจ๋“ˆ ๋ฒ”์œ„ ๋ณ€์ˆ˜ x๋ฅผ ๋‹ซ๋Š” ํ•œ ์Œ์˜ getter-setter ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. x๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„, ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
import { getX, setX } from "./myModule.js";

console.log(getX()); // 5
setX(6);
console.log(getX()); // 6

ํด๋กœ์ €๋Š” ์›๋ž˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ๊ฐ€์ ธ์˜จ ๊ฐ’๋„ ๊ทธ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— "live bindings"๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฐ€์ ธ์˜จ ๊ฐ’์„ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
// myModule.js
export let x = 1;
export const setX = (val) => {
  x = val;
};
js
// closureCreator.js
import { x } from "./myModule.js";

export const getX = () => x;
// ๊ฐ€์ ธ์˜จ live binding์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.
js
import { getX } from "./closureCreator.js";
import { setX } from "./myModule.js";

console.log(getX()); // 1
setX(2);
console.log(getX()); // 2

๋ฃจํ”„์—์„œ ํด๋กœ์ € ์ƒ์„ฑํ•˜๊ธฐ: ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜

let ํ‚ค์›Œ๋“œ๊ฐ€ ๋„์ž…๋˜๊ธฐ ์ „์—๋Š” ํด๋กœ์ €์™€ ๊ด€๋ จ๋œ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ๋ฃจํ”„ ์•ˆ์—์„œ ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ด…์‹œ๋‹ค.

html
<p id="help">Helpful notes will appear here</p>
<p>E-mail: <input type="text" id="email" name="email" /></p>
<p>Name: <input type="text" id="name" name="name" /></p>
<p>Age: <input type="text" id="age" name="age" /></p>
js
function showHelp(help) {
  document.getElementById("help").textContent = help;
}

function setupHelp() {
  var helpText = [
    { id: "email", help: "Your e-mail address" },
    { id: "name", help: "Your full name" },
    { id: "age", help: "Your age (you must be over 16)" },
  ];

  for (var i = 0; i < helpText.length; i++) {
    // ๋ฒ”์ธ์€ ์ด ์ค„์—์„œ `var`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    var item = helpText[i];
    document.getElementById(item.id).onfocus = function () {
      showHelp(item.help);
    };
  }
}

setupHelp();

JSFiddle ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”.

helpText ๋ฐฐ์—ด์€ ์„ธ ๊ฐœ์˜ ๋„์›€๋ง ํžŒํŠธ๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ๊ฐ ๋„์›€๋ง์€ ๋ฌธ์„œ์˜ ์ž…๋ ฅ ํ•„๋“œ์˜ ID์™€ ์—ฐ๊ด€๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ฐ ์ž…๋ ฅ ํ•„๋“œ ID์— ํ•ด๋‹นํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ์˜ onfocus ์ด๋ฒคํŠธ์— ๊ด€๋ จ๋œ ๋„์›€๋ง์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฉ”์†Œ๋“œ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ํ•„๋“œ์— ํฌ์ปค์Šค๋ฅผ ์ฃผ๋”๋ผ๋„ ๋‚˜์ด์— ๊ด€ํ•œ ๋„์›€๋ง์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” onfocus ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜๊ฐ€ ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ํด๋กœ์ €๋Š” ํ•จ์ˆ˜ ์ •์˜์™€ setupHelp ํ•จ์ˆ˜ ๋ฒ”์œ„์—์„œ ์บก์ฒ˜๋œ ํ™˜๊ฒฝ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์—์„œ ์„ธ ๊ฐœ์˜ ํด๋กœ์ €๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ, ๊ฐ ํด๋กœ์ €๋Š” ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ (item) ์žˆ๋Š” ๊ฐ™์€ ๋‹จ์ผ ์–ดํœ˜์  ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€์ˆ˜ item์ด var๋กœ ์„ ์–ธ๋˜์–ด ํ˜ธ์ด์ŠคํŒ…(hoisting)์œผ๋กœ ์ธํ•ด ํ•จ์ˆ˜ ๋ฒ”์œ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. item.help์˜ ๊ฐ’์€ onfocus ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋  ๋•Œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์€ ๊ทธ ์‹œ๊ฐ„๊นŒ์ง€ ์ด๋ฏธ ๊ทธ ๊ณผ์ •์„ ์‹คํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, item ๋ณ€์ˆ˜ ๊ฐ์ฒด(์„ธ ๊ฐœ์˜ ํด๋กœ์ € ๋ชจ๋‘์—์„œ ๊ณต์œ ํ•˜๋Š”)๋Š” helpText ๋ชฉ๋ก์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ ๋” ๋งŽ์€ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์•ž์—์„œ ์„ค๋ช…ํ•œ ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

js
function showHelp(help) {
  document.getElementById("help").innerHTML = help;
}

function makeHelpCallback(help) {
  return function () {
    showHelp(help);
  };
}

function setupHelp() {
  var helpText = [
    { id: "email", help: "Your e-mail address" },
    { id: "name", help: "Your full name" },
    { id: "age", help: "Your age (you must be over 16)" },
  ];

  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
  }
}

setupHelp();

์ด JSFiddle ๋งํฌ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”.

์ด๊ฒƒ์€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋‹จ์ผ ์–ดํœ˜ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ์ฝœ๋ฐฑ ๋Œ€์‹ ์—, makeHelpCallback ํ•จ์ˆ˜๋Š” ๊ฐ๊ฐ์˜ ์ฝœ๋ฐฑ์— "์ƒˆ๋กœ์šด ์–ดํœ˜์  ํ™˜๊ฒฝ"์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ, help๋Š” helpText ๋ฐฐ์—ด์˜ ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ต๋ช… ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

js
function showHelp(help) {
  document.getElementById("help").innerHTML = help;
}

function setupHelp() {
  var helpText = [
    { id: "email", help: "Your e-mail address" },
    { id: "name", help: "Your full name" },
    { id: "age", help: "Your age (you must be over 16)" },
  ];

  for (var i = 0; i < helpText.length; i++) {
    (function () {
      var item = helpText[i];
      document.getElementById(item.id).onfocus = function () {
        showHelp(item.help);
      };
    })(); // ํ•ญ๋ชฉ์˜ ํ˜„์žฌ ๊ฐ’์ด ํฌํ•จ๋œ ์ฆ‰๊ฐ์ ์ธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€(๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค).
  }
}

setupHelp();

ํด๋กœ์ €๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด, let ๋˜๋Š” const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
function showHelp(help) {
  document.getElementById("help").textContent = help;
}

function setupHelp() {
  const helpText = [
    { id: "email", help: "Your email address" },
    { id: "name", help: "Your full name" },
    { id: "age", help: "Your age (you must be over 16)" },
  ];

  for (let i = 0; i < helpText.length; i++) {
    const item = helpText[i];
    document.getElementById(item.id).onfocus = () => {
      showHelp(item.help);
    };
  }
}

setupHelp();

์œ„์˜ ๊ฒฝ์šฐ var ๋Œ€์‹  const์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํด๋กœ์ €๊ฐ€ ๋ธ”๋ก ๋ฒ”์œ„ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ํด๋กœ์ €๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด forEach()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ helpText ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ฐ <input>์— ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

js
function showHelp(help) {
  document.getElementById("help").textContent = help;
}

function setupHelp() {
  var helpText = [
    { id: "email", help: "Your e-mail address" },
    { id: "name", help: "Your full name" },
    { id: "age", help: "Your age (you must be over 16)" },
  ];

  helpText.forEach(function (text) {
    document.getElementById(text.id).onfocus = function () {
      showHelp(text.help);
    };
  });
}

setupHelp();

์„ฑ๋Šฅ ๊ด€๋ จ ๊ณ ๋ ค ์‚ฌํ•ญ

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๊ฐ์ฒด/ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋ฉ”์†Œ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ์ž์— ์ •์˜๋˜๊ธฐ๋ณด๋‹ค๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค์‹œ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์ฆ‰, ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค).

๋‹ค์Œ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.

js
function MyObject(name, message) {
  this.name = name.toString();
  this.message = message.toString();
  this.getName = function () {
    return this.name;
  };

  this.getMessage = function () {
    return this.message;
  };
}

์•ž์˜ ์ฝ”๋“œ๋Š” ํŠน์ • ์ธ์Šคํ„ด์Šค์—์„œ ํด๋กœ์ €์˜ ์ด์ ์„ ํ™œ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋‹ค์‹œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
function MyObject(name, message) {
  this.name = name.toString();
  this.message = message.toString();
}
MyObject.prototype = {
  getName() {
    return this.name;
  },
  getMessage() {
    return this.message;
  },
};

๊ทธ๋Ÿฌ๋‚˜, ํ”„๋กœํ† ํƒ€์ž…์„ ๋‹ค์‹œ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ธฐ์กด ํ”„๋กœํ† ํƒ€์ž…์— ์ถ”๊ฐ€ํ•˜๋Š” ๋‹ค์Œ ์˜ˆ์ œ๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

js
function MyObject(name, message) {
  this.name = name.toString();
  this.message = message.toString();
}
MyObject.prototype.getName = function () {
  return this.name;
};
MyObject.prototype.getMessage = function () {
  return this.message;
};

์•ž์˜ ๋‘ ๊ฐ€์ง€ ์˜ˆ์ œ์—์„œ, ์ƒ์†๋œ ํ”„๋กœํ† ํƒ€์ž…์€ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๊ณต์œ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฉ”์„œ๋“œ ์ •์˜๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์‹œ๋งˆ๋‹ค ๋ฐœ์ƒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ์† ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.