Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป๊ณต๋ถ€ ๊ธฐ๋ก/๐Ÿ“Œ ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ์Šคํ„ฐ๋””

[๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ์Šคํ„ฐ๋””] JavaScript ํ•จ์ˆ˜์™€ ํ˜ธ์ด์ŠคํŒ…

๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

๐Ÿ“‘ JavaScript ํ•จ์ˆ˜์™€ ํ˜ธ์ด์ŠคํŒ… (Hoisting)

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

ํŠนํžˆ ํ˜ธ์ด์ŠคํŒ…(Hoisting)์ด๋ผ๋Š” ๊ธฐ๋Šฅ ๋•๋ถ„์—, ํ•จ์ˆ˜ ์„ ์–ธ์ด ์ฝ”๋“œ ์‹คํ–‰ ์‹œ์ ๋ณด๋‹ค ๋’ค์— ์žˆ์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์ค‘์ฒฉ ํ•จ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

 


๐ŸŸช ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ํ˜ธ์ถœ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

function getArea(width, height) {
  let area = width * height;
  return area;
}

let area1 = getArea(10, 20);
console.log(area1); // 200

let area2 = getArea(30, 20);
console.log(area2); // 600

 

getArea๋ผ๋Š” ํ•จ์ˆ˜๋Š” width์™€ height๋ฅผ ๋ฐ›์•„์„œ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•œ ๋’ค ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ํ•จ์ˆ˜๋ช…(์ธ์ž) ํ˜•ํƒœ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ, ๋ฐ˜ํ™˜๋œ ๊ฐ’์€ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 ๐Ÿ“Œ ์ฐธ๊ณ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๋„ ์ผ๊ธ‰ ๊ฐ์ฒด(First-class Citizen)์ด๊ธฐ ๋•Œ๋ฌธ์—

๊ฐ’์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹น
let greet = function() {
  console.log("์•ˆ๋…•ํ•˜์„ธ์š”!");
};

greet(); // "์•ˆ๋…•ํ•˜์„ธ์š”!"
function multiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

let double = multiplier(2);
console.log(double(5)); // 10

let triple = multiplier(3);
console.log(triple(5)); // 15

 

 


๐ŸŸจ ์ค‘์ฒฉ ํ•จ์ˆ˜ (Nested Function)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์ค‘์ฒฉ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

function outer() {
  console.log("outer function");
  function inner() {
    console.log("inner function");
  }
  inner();
}
outer();

// ์ถœ๋ ฅ ๊ฒฐ๊ณผ
// "outer function"
// "inner function"

 

์ด๋ ‡๊ฒŒ ์„ ์–ธ๋œ inner ํ•จ์ˆ˜๋Š” ์˜ค์ง outer ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์™ธ๋ถ€์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์บก์Аํ™”(encapsulation)ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๊ณ ,

์™ธ๋ถ€์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

 


๐ŸŸฅ ํ˜ธ์ด์ŠคํŒ…(Hoisting)์ด๋ž€

ํ˜ธ์ด์ŠคํŒ…์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์—

๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ์„ ์–ธ์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๋™์ž‘์„ ๋งํ•œ๋‹ค.

 

sayHello(); // "Hello!"

function sayHello() {
  console.log("Hello!");
}

 

์ด์ฒ˜๋Ÿผ sayHello ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ์ž˜ ์‹คํ–‰๋œ๋‹ค.

 

 

๐Ÿ“Œ ์ฐธ๊ณ 

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ๋˜‘๊ฐ™์ด ํ˜ธ์ด์ŠคํŒ… ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

greet(); // "Hi"

function greet() {
  console.log("Hi");
}
greet(); // โŒ TypeError: greet is not a function

let greet = function() {
  console.log("Hi");
};

 

๋‘ ์˜ˆ์ œ ์ฝ”๋“œ์˜ ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ?

 

๋ฐ”๋กœ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์ด์–ด์„œ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์ง€๋งŒ,

๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋ผ๋Š” ์ ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰๋•Œ๊ธฐ ๋•Œ๋ฌธ์—

ํ˜ธ์ด์ŠคํŒ… ์‹œ์ ์— undefined๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

(ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋˜ํ•œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๊ทœ์น™์ด ์ ์šฉ๋œ๋‹ค.)

 

 

๐Ÿ“Œ ์ฐธ๊ณ 

๋˜ํ•œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— var๋„ ํ˜ธ์ด์ŠคํŒ… ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

console.log(a); // undefined
var a = 10;
console.log(a); // 10

 

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

var a;          // ์„ ์–ธ๋งŒ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง (undefined๋กœ ์ดˆ๊ธฐํ™”)
console.log(a); // undefined
a = 10;
console.log(a); // 10

 

์ด์ฒ˜๋Ÿผ var๋Š” ํ˜ธ์ด์ŠคํŒ… ์‹œ ์ž๋™์œผ๋กœ undefined๋กœ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์—

์„ ์–ธ ์ „์— ์ ‘๊ทผํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ undefined๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋ฌธ์ œ๋Š”, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์‹ค์ˆ˜๋กœ ์„ ์–ธ ์ „์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์ ์ด๋‹ค.

 

 

๊ทธ๋ž˜์„œ ๋ณดํ†ต์€ let๊ณผ const๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฌผ๋ก , let๊ณผ const๋„ ์‚ฌ์‹ค ์„ ์–ธ ์ž์ฒด๋Š” ํ˜ธ์ด์ŠคํŒ… ๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ,

ํ˜ธ์ด์ŠคํŒ…๋œ ์‹œ์ ๋ถ€ํ„ฐ ์‹ค์ œ ์„ ์–ธ๋ฌธ์ด ์‹คํ–‰๋„๊ธฐ ์ „๊นŒ์ง€ ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(TDZ)์— ๋จธ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด ์—๋Ÿฌ๋ฅผ ๋˜์ ธ์ค€๋‹ค๊ณ  ํ•œ๋‹ค.

console.log(b); // โŒ ReferenceError: Cannot access 'b' before initialization
let b = 10;
console.log(b); // 10

 

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

// b๋Š” ํ˜ธ์ด์ŠคํŒ…๋˜์—ˆ์ง€๋งŒ, TDZ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ๋ฌธ์„ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์ ‘๊ทผ ๋ถˆ๊ฐ€
console.log(b); // ReferenceError
let b = 10;     // ์—ฌ๊ธฐ์„œ ๋น„๋กœ์†Œ ์ดˆ๊ธฐํ™”๋จ
console.log(b); // 10

 

์ฆ‰, let๊ณผ const๋Š” ์„ ์–ธ๋งŒ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๊ณ  ์ดˆ๊ธฐํ™”๋Š” ์‹ค์ œ ์ฝ”๋“œ ์œ„์น˜์—์„œ ๋œ๋‹ค๋Š” ๊ทœ์น™ ๋•Œ๋ฌธ์—

์„ ์–ธ๋ฌธ ์ด์ „์— ์ ‘๊ทผํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์—๋Ÿฌ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์ด๊ณ , ์ด๋ฅผ TDZ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.

 

 


๐Ÿ“š ๊ฒฐ๋ก 

๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ๋ณด๊ธฐ ํž˜๋“ค์—ˆ๋˜ ํ˜ธ์ด์ŠคํŒ… ํŠน์„ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ,

๊ทธ๋ž˜๋„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒŒ ๋” ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ

์•ž์œผ๋กœ๋„ ํŒŒ์ผ ์ƒ๋‹จ์ด๋‚˜ ๋ชจ๋“ˆ์— ํ•จ์ˆ˜ ์„ ์–ธ์„ ๋ชจ์•„๋‘๋Š” ๋ฐฉ์‹์„ ์“ธ ๊ฒƒ ๊ฐ™๊ธฐ๋Š” ํ•˜๋‹ค.

 

ํŠนํžˆ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์—๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ์ ์šฉ๋˜์ง€๋งŒ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์  ๋•Œ๋ฌธ์—

ํ˜ธ์ด์ŠคํŒ… ๋•๋ถ„์— ์ž˜ ๋Œ์•„๊ฐ„๋‹ค์— ์˜์กดํ•˜๊ธฐ ๋ณด๋‹ค๋Š”, ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•