ํ•ญํ•ด99

Javascript ๊ฐœ๋… ์ •๋ฆฌ(3) - ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ

JIN_Coder 2022. 7. 16. 23:46

๐Ÿค ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ผ๊นŒ ?

 

ํ˜ธ์ด์ŠคํŒ…

 

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด๋‘๋Š”๊ฒƒ

๋ณ€์ˆ˜,ํ•จ์ˆ˜์˜ ์„ ์–ธ๋ถ€๊ฐ€ ์œ„์น˜ํ•œ ์ธ์ ‘ ์Šค์ฝ”ํ”„์˜ ์‹œ์ž‘ ์ง€์ ์—์„œ ํ•ด๋‹น ์‹๋ณ„์ž์˜ ๊ด€์ธก์ด ๊ฐ€๋Šฅํ•œ ํ˜„์ƒ

 

 - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Parser๊ฐ€ ํ•จ์ˆ˜ ์‹คํ–‰ ์ „ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ ํ›‘๋Š”๋‹ค.
 - ํ•จ์ˆ˜ ์•ˆ์— ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜/ํ•จ์ˆ˜์„ ์–ธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์‹คํ–‰์‹œํ‚จ๋‹ค.
 - ์œ ํšจ ๋ฒ”์œ„: ํ•จ์ˆ˜ ๋ธ”๋ก {} ์•ˆ์—์„œ ์œ ํšจ

JS์—”์ง„์ด ๋ชจ๋“  ์Šค์ฝ”ํ”„ ๋˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ์‹๋ณ„์ž๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์‹คํ–‰ ์‹œ์ ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ์„ ์–ธ๋œ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ ์ด์ „์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๊ฒƒ์ด๋‹ค.

 

์ฆ‰, ํ•จ์ˆ˜ ๋‚ด์—์„œ ์•„๋ž˜์ชฝ์— ์กด์žฌํ•˜๋Š” ๋‚ด์šฉ ์ค‘ ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ

 - ์‹ค์ œ๋กœ ์ฝ”๋“œ๊ฐ€ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๊ฑด ์•„๋‹ˆ๋ฉฐ, js parser ๋‚ด์ฃผ๋ณ€์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์„œ ์ฒ˜๋ฆฌ

 - ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋Š” ๋ณ€ํ™”๊ฐ€ ์—†์Œ

 

 

ํ˜ธ์ด์ŠคํŒ…์„ ํ•˜๊ธฐ์ „ ์•Œ๋ฉด ์ข‹์€ ๊ฒƒ

js์—”์ง„์—์„œ ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋‹จ๊ณ„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ → ์ดˆ๊ธฐํ™” → ํ• ๋‹น์„ ๊ฑฐ์ณ ์ƒ์„ฑ๋จ

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

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋ก๋œ ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

var์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ์„ ์–ธ&์ดˆ๊ธฐํ™”๊ฐ€ ํ•จ๊ป˜ ์ง„ํ–‰๋˜๋ฏ€๋กœ, ๋ณ€์ˆ˜ ๊ฐ์ฒด ๋“ฑ๋ก๊ณผ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋„ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์€ ์ƒํƒœ์ด๋ฏ€๋กœ ํ˜ธ์ด์ŠคํŒ…์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

console.log(a);  // ๋ณ€์ˆ˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ  -> undefined
var a;           // ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋ก & ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ›์Œ

console.log(a); // ๋ณ€์ˆ˜ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ  -> error
let a;          // ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋ก & ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ชป ๋ฐ›์Œ

 

 

ํ˜ธ์ด์ŠคํŒ… ๋Œ€์ƒ

var ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚จ

 - var ๋ณ€์ˆ˜/ํ•จ์ˆ˜์˜ ์„ ์–ธ๋งŒ ์œ„๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง€๋ฉฐ, ํ• ๋‹น์€ ๋Œ์–ด ์˜ฌ๋ ค์ง€์ง€ ์•Š์Œ
 - let/const ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ํ‘œํ˜„์‹์—์„œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

ํ˜ธ์ด์ŠคํŒ…์„ ์ดˆ๊ธฐํ™”๊นŒ์ง€ ํฌํ•จํ•˜์ง€ ์•Š๊ณ , ์ธ์ ‘ ์Šค์ฝ”ํ”„ ์ƒ๋‹จ์—์„œ ์„ ์–ธ๋ถ€๋ฅผ ๊ด€์ธกํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„์ƒ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด

var, function ํ‚ค์›Œ๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ let๊ณผ const ๋˜ํ•œ ํ˜ธ์ด์ŠคํŒ…์˜ ๋Œ€์ƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ

(์ดˆ๊ธฐํ™”๊นŒ์ง€ ์น˜๋ฉด ์•„๋‹ˆ์ง€๋งŒ let๊ณผ const๋„ ์„ ์–ธํ•œ๊ฑฐ๊นŒ์ง€ ์‹๋ณ„ํ•˜๋‹ˆ๊นŒ ์—ฌ๊ธฐ๊นŒ์ง€ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ ๋ด์•ผํ•˜๋Š”๊ฐ€๋Š” ์‚ฌ๋žŒ๋งˆ๋‹ค ์ข€ ๋‹ค๋ฅธ๊ฒƒ ๊ฐ™์Œ ์‹๋ณ„ํ•ด์„œ ์—๋Ÿฌ๋ฅผ ๋งํ•ด์ฃผ๋‹ˆ๊นŒ)

 

 

ํ˜ธ์ด์ŠคํŒ… ๊ทœ์น™

  1. ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ์„ ์–ธ๋œ var ๋Š” ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. ์„ ์–ธ๋œ let , const ๋Š” ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…์‹œ undefined๋กœ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”

์„ ์–ธ ์ด์ „์— ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์„ ๋•Œ var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” undefined๊ฐ€ ์ถœ๋ ฅ

์„ ์–ธ ์ดํ›„์— ์‚ฌ์šฉํ•˜๋ฉด ์„ ์–ธํ•œ ๊ฐ’์ด ํ• ๋‹น๋˜์–ด์„œ ์‚ฌ์šฉ

 

๋ฐ˜๋ฉด let๊ณผ const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…์‹œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ

let,const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋œธ

console.log(a) // undefiend var์—ฌ์„œ ํ˜ธ์ด์ŠคํŒ… ๋ฌ์ง€๋งŒ undefiend๋กœ ์ดˆ๊ธฐํ™” ์ƒํƒœ
var a = 1;
console.log(a) // 1     1๋กœ ์ดˆ๊ธฐํ™” ์ƒํƒœ

console.log(b) // Uncaught ReferenceError: b is not defined
let b = 1;

console.log(c); // ReferenceError
const c = '1';

print()  // d

function print() {
  console.log('d')
}

print2()  // error

const print2 = () => {
  console.log('e')
}

๊ทธ๋ž˜์„œ ์š”์ฆ˜์€ var๋ฅผ ์•ˆ์“ฐ๊ณ  let๊ณผ const๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” ์ด์œ ๋Š”

๋ณ€์ˆ˜ ํ• ๋‹น์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐ”๋กœ ์•Œ์ˆ˜ ์žˆ๊ณ (์˜ค๋ฅ˜๋ฐœ์ƒ์ด ๋ณด์ด๋‹ˆ๊นŒ)

var๋Š” ์„ ์–ธ ์ „ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ด์„œ ์ดํ›„์— ์žฌํ• ๋‹น๋˜๋ฉด ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

 

 

ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๊ฐ€์žฅ ๋จผ์ € ์ด๋ฃจ์–ด์ง

ํ•จ์ˆ˜ ์„ ์–ธ์€ ํ˜ธ์ด์ŠคํŒ…์ด ์ด๋ฃจ์–ด์ ธ ํ•จ์ˆ˜ ๋ณด๋‹ค ์œ„์—์„œ ์‹คํ–‰ํ•ด๋„ ์ž‘๋™๋จ

BUT ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ˜ธ์ŠคํŒ… ๋˜์ง€ ์•Š์•„ ํ•จ์ˆ˜ ์œ„์—์„œ ์‹คํ–‰์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ

 

ํ•จ์ˆ˜์„ ์–ธ์ด๋ž€

// ํ•จ์ˆ˜ ์„ ์–ธ์‹์ด๋ž€
function calcRectArea(width, height) {
  return width * height;
}
console.log(calcRectArea(5, 6));
// expected output: 30

// ์„ ์–ธ์€ ํ˜ธ์ด์ŠคํŒ… ๊ฐ€๋Šฅ
print()  // a

function print() {
  console.log('a')
}

ํ•จ์ˆ˜ํ‘œํ˜„์‹์ด๋ž€

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋ž€
const getRectArea = function(width, height) {
  return width * height;
};
console.log(getRectArea(3, 4));
// expected output: 12

// ํ‘œํ˜„์‹์€ ํ˜ธ์ด์ŠคํŒ… ์•ˆ๋Œ€์„œ ์—๋Ÿฌ๋‚จ
print()  // error

const print = () => {
  console.log('a')
}

 

 

๊ฒฐ๋ก 

 - ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” ์„ ์–ธ๋ฌธ ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 - var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ฌธ ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 - let, const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ƒ๋‹จ์—์„œ ์ฐธ์กฐ, ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋˜๋„๋ก var๋ฅผ ์‚ฌ์šฉ๋ง๊ณ  let, const๋ฅผ ์‚ฌ์šฉ

๋ณ€์ˆ˜๋“  ํ•จ์ˆ˜๋“  ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ž

 

 

 

[JS] ํ˜ธ์ด์ŠคํŒ…(hoisting)

1) ํ˜ธ์ด์ŠคํŒ…์ด๋ž€? (1) ํ˜ธ์ด์ŠคํŒ… ๊ฐœ๋… ๋ณ€์ˆ˜&ํ•จ์ˆ˜ ์„ ์–ธ๋งŒ ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๊ฑธ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๊ณ  ํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด๋„ ์ƒ๋‹จ์—์„œ ๋ณ€์ˆ˜ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. console.log(

mong-blog.tistory.com

 

ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•œ ์˜คํ•ด์™€ ์ง„์‹ค

tecoble.techcourse.co.kr

 

Javascript ํ˜ธ์ด์ŠคํŒ…

this ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋ณด๋Š” ๋‹จ์–ด ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜ธ์ด์ŠคํŒ…์ด๋‹ค. ์–ด๋Š์ •๋„๋Š” ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ž˜ ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„์ด๋‚˜ ํŠนํžˆ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋˜ ๋ถ€๋ถ„๋„ ๋งŽ์•„ ์ •๋ฆฌํ•˜๋Š”๊ฒŒ ๋งŽ์€ ๋„์›€์ด ๋˜

velog.io

 

 

 

์Šค์ฝ”ํ”„

 

์Šค์ฝ”ํ”„๋ž€, ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„

์‹๋ณ„์ž ์ ‘๊ทผ ๊ทœ์น™์— ๋”ฐ๋ฅธ ์œ ํšจ ๋ฒ”์œ„

 

์Šค์ฝ”ํ”„์˜ ์ฃผ์š” ๊ทœ์น™

1. ์•ˆ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ๋ฐ”๊นฅ์ชฝ ์Šค์ฝ”ํ”„๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅ

 - ๋ฐ”๊นฅ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ์‹๋ณ„์ž๋Š” ์•ˆ์ชฝ์Šค์ฝ”ํ”„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 - ๋ฐ˜๋Œ€๋กœ ์•ˆ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ์‹๋ณ„์ž๋Š” ๋ฐ”๊นฅ์ชฝ์—์„œ ์‚ฌ์šฉ ํ• ์ˆ˜ ์—†๋‹ค.

 

2. ์Šค์ฝ”ํ”„๋Š” ์ค‘์ฒฉ์ด ๊ฐ€๋Šฅํ•จ

 - ํ•จ์ˆ˜์•ˆ์— ํ•จ์ˆ˜์•ˆ์— ํ•จ์ˆ˜ ์ฒ˜๋Ÿผ ๊ฐ€์žฅ์•ˆ์ชฝ ํ•จ์ˆ˜์—์„œ ๊ฐ€์žฅ ๋ฐ”๊นฅ ํ•จ์ˆ˜์˜ ์‹๋ณ„์ž ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ(์ค‘์ฒฉ)

 

3. ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์Œ

 - ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ด๋‹ค.

 - ์ง€์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.

 - ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ณด๋‹ค ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

์Šค์ฝ”ํ”„์˜ 2๊ฐ€์ง€ ํƒ€์ž…

 - ์ „์—ญ์Šค์ฝ”ํ”„(global)

 - ์ง€์—ญ์Šค์ฝ”ํ”„(local)

 

์ „์—ญ์Šค์ฝ”ํ”„

์ „์—ญ์— ์„ ์–ธ๋˜์–ด์žˆ์–ด ์–ด๋Š ๊ณณ์—์„œ๋“ ์ง€ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

 

์ง€์—ญ์Šค์ฝ”ํ”„

ํ•ด๋‹น ์ง€์—ญ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ์ง€์—ญ์„ ๋ฒ—์–ด๋‚œ ๊ณณ์—์„  ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ

ex)ํ•จ์ˆ˜์Šค์ฝ”ํ”„, ๋ธ”๋ก์Šค์ฝ”ํ”„

 

ํ•จ์ˆ˜์Šค์ฝ”ํ”„

ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ ํ• ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•จ์ˆ˜ ๋ชธ์ฒด์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜ ๋ชธ์ฒด ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

var a = 1; // ์ „์—ญ ์Šค์ฝ”ํ”„
function print() { // ์ง€์—ญ(ํ•จ์ˆ˜) ์Šค์ฝ”ํ”„
 var a = 111;
 console.log(a); 
}
print(); // 111
console.log(a); // 1

ํ•จ์ˆ˜์•ˆ์—์„œ a = 111์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•ด์„œ ์ฝ˜์†”์— ์ฐ๊ณ  ํ•จ์ˆ˜๋Š” ์‚ฌ๋ช…์„ ๋‹คํ•จ(ํ•จ์ˆ˜ ๋‚ด ์ง€์—ญ์—์„œ๋งŒ ์œ ํšจํ•จ)

var a = 1; // ์ „์—ญ ์Šค์ฝ”ํ”„
function print() { // ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„
 console.log(a);
}
print(); // 1

ํ•จ์ˆ˜์•ˆ์—์„œ a๋ฅผ ๋”ฐ๋กœ ํ• ๋‹นํ•ด์ฃผ์ง„ ์•Š์•˜์ง€๋งŒ, ์ง€์—ญ์Šค์ฝ”ํ”„๋‚ด ํ• ๋‹น์ด ์—†์œผ๋ฉด ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ†ตํ•ด ์ „์—ญ์Šค์ฝ”ํ”„์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์Œ

 

 

๋ธ”๋ก ์Šค์ฝ”ํ”„

{ } ์ค‘๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋ถ€๋ถ„์„ ๋ธ”๋ก

 

 

 

์Šค์ฝ”ํ”„์™€ var, let, const

const

์œ ํšจ๋ฒ”์œ„ : ๋ธ”๋ก์Šค์ฝ”ํ”„ / ํ•จ์ˆ˜์Šค์ฝ”ํ”„

๊ฐ’ ์žฌํ• ๋‹น : ๋ถˆ๊ฐ€๋Šฅ

์žฌ์„ ์–ธ : ๋ถˆ๊ฐ€๋Šฅ

 

let

์œ ํšจ๋ฒ”์œ„ : ๋ธ”๋ก์Šค์ฝ”ํ”„ / ํ•จ์ˆ˜์Šค์ฝ”ํ”„

๊ฐ’ ์žฌํ• ๋‹น : ๊ฐ€๋Šฅ

์žฌ์„ ์–ธ : ๋ถˆ๊ฐ€๋Šฅ

 

var

์œ ํšจ๋ฒ”์œ„ : ํ•จ์ˆ˜์Šค์ฝ”ํ”„

๊ฐ’ ์žฌํ• ๋‹น : ๊ฐ€๋Šฅ

์žฌ์„ ์–ธ : ๊ฐ€๋Šฅ

 

for(let i=0; i<10; i++) { // let์‚ฌ์šฉ
  console.log(i); //0,1,2,3,4,...
}
// ์ „์—ญ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ i ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ์œผ๋กœ ์•„๋ž˜์—์„œ ReferenceErrer์„ ์ผ์œผํ‚จ๋‹ค.
console.log(i); // ReferenceErrer

๋ธ”๋ก ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ let๊ณผ const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

for(var i=0; i<10; i++) {  // var ์‚ฌ์šฉ
  console.log(i);
}
// var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ i ๋Š” ์ง€์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ๋ชจ๋“  ์Šค์ฝ”ํ”„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
console.log(i); // 9

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์Šค์ฝ”ํ”„ ์šธํƒ€๋ฆฌ ๋ฐ–์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. (var๋Š” Only ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋งŒ ๋”ฐ๋ฅธ๋‹ค.)

 

๊ทธ๋Ÿฌ๋‚˜ ๋ธ”๋ก ๋‹จ์œ„๋กœ ์Šค์ฝ”ํ”„๋ฅผ ๊ตฌ๋ถ„ํ–ˆ์„ ๋•Œ, ํ›จ์”ฌ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ let ํ‚ค์›Œ๋“œ์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅ

 

 

๋ณ€์ˆ˜ ์„ ์–ธ์‹œ ์ฃผ์˜์ 

์ „์—ญ๊ฐ์ฒด(window)

Window ๊ฐ์ฒด๋Š” only ๋ธŒ๋ผ์šฐ์ €์—๋งŒ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด

๋ธŒ๋ผ์šฐ์ €์˜ ์ฐฝ(window)๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฐ์ฒด

๊ทธ๋Ÿฐ๋ฐ ๋ณ„๊ฐœ๋กœ ์ „์—ญ ์˜์—ญ์„ ๋‹ด๊ณ  ์žˆ์Œ

๊ทธ๋ž˜์„œ ํ•จ์ˆ˜ ์„ ์–ธ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ var ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด window ๊ฐ์ฒด์— ์†ํ•จ

 

์ „์—ญ๋ณ€์ˆ˜๋Š” ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

 - ๊ฐ€์žฅ ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„์— ์ •์˜ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์ „์—ญ๋ณ€์ˆ˜

 - ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ

 - ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์ตœ์†Œํ™” ํ•˜๋ฉด ์˜๋„์น˜ ์•Š์€ ๋กœ์ง์— ์˜ํ•œ ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

 - ํŠนํžˆ ์„ ์–ธ ์—†์ด ์„ ์–ธํ•˜๋ฉด var๋กœ ์„ ์–ธ ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰(๊ทธ๋Ÿผ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ๊ณ„์† ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ) ์ฃผ์˜

 

 

(JavaScript) ์Šค์ฝ”ํ”„(Scope)๋ž€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ ์Šค์ฝ”ํ”„(Scope)๋ž€ ๋‹จ์–ด๋ฅผ ๋งŽ์ด ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ์ด ์Šค์ฝ”ํ”„๋ž€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

medium.com

 

[JavaScript] ์Šค์ฝ”ํ”„(Scope)์™€ ๋ณ€์ˆ˜ ์„ ์–ธ (var, let, const ํ‚ค์›Œ๋“œ ์ฐจ์ด์ ) - ํ•˜๋‚˜๋ชฌ

โšก๏ธ ์Šค์ฝ”ํ”„(Scope) ์Šค์ฝ”ํ”„(Scope)๋ผ๋Š” ์˜์–ด ๋‹จ์–ด ์ž์ฒด๋Š” ‘๋ฒ”์œ„’๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ปดํ“จํ„ฐ ๊ณตํ•™, ๊ทธ๋ฆฌ๊ณ  JavaScript ์—์„œ๋„ ‘๋ฒ”์œ„’์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. JavaScript ์—๋งŒ ๊ตญํ•œ๋œ ๊ฐœ๋…์€ ์•„๋‹ˆ๋‹ค.  

hanamon.kr

 

 

 

TDZ(Temporal Dead Zone)

์ผ์‹œ์ ์ธ ์‚ฌ๊ฐ์ง€๋Œ€๋ž€ ๋œป

์ผ์‹œ์ ์ธ ์‚ฌ๊ฐ์ง€๋Œ€๋Š” ์Šค์ฝ”ํ”„์˜ ์‹œ์ž‘ ์ง€์ ๋ถ€ํ„ฐ ์ดˆ๊ธฐํ™” ์‹œ์ž‘ ์ง€์ ๊นŒ์ง€์˜ ๊ตฌ๊ฐ„

 

 

๋ณ€์ˆ˜ ์„ ์–ธ 3๋‹จ๊ณ„

1. ์„ ์–ธ ๋‹จ๊ณ„(Declaration phase)

๋ณ€์ˆ˜๋ฅผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ๋“ฑ๋กํ•˜๋Š” ๋‹จ๊ณ„. ์ด ๋ณ€์ˆ˜ ๊ฐ์ฒด๋Š” ์Šค์ฝ”ํ”„๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ

 

2. ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„(Initialization phase)

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์กด์žฌ ํ•˜๋Š” ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ์„ ์–ธ ๋‹จ๊ณ„์˜ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„. ์ด ๋‹จ๊ณ„์—์„œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”

 

3. ํ• ๋‹น ๋‹จ๊ณ„(Assignment phase)

์‚ฌ์šฉ์ž๊ฐ€ undefined๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋‹จ๊ณ„.

 

์œ„ ํ˜ธ์ด์ŠคํŒ…์—์„œ ๋งํ–ˆ์ง€๋งŒ, var ํ‚ค์›Œ๋“œ ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ์ „์— ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋ฅผ ๋™์‹œ์— ์ง„ํ–‰

๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ์„ ํ•ด๋„ undefined๋กœ ํ˜ธ์ถœ์ด ๋˜๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒ

 

let, const๋Š” ์„ ์–ธ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด์„œ ์ง„ํ–‰

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น์ด ๋˜์งˆ ์•Š์•„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด ์ฐธ์กฐ ์—๋Ÿฌ(ReferenceError)๊ฐ€ ๋ฐœ์ƒ

TDZ ๋ผ๋Š” ๊ฒƒ์€ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ ์ „ ์‚ฌ์ด์˜ ์‚ฌ๊ฐ์ง€๋Œ€

 

TDZ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ตฌ๋ฌธ

let, const, class

์œ„ ์„ธ๊ฐœ๋Š” ํ•ญ์ƒ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ํ›„ ์‚ฌ์šฉํ•ด์•ผํ•จ(์•ˆ๊ทธ๋Ÿฌ๋ฉด ์—๋Ÿฌ๋‚จ)

// Does not work!

console.log(cat)  // error : ReferenceError
const cat = "์•ผ์˜น"

count; // throws `ReferenceError`
let count = 10;

const myNissan = new Car('red'); // throws `ReferenceError`

class Car {
  constructor(color) {
    this.color = color;
  }
}

------

// Works!

const cat = "์•ผ์˜น"
console.log(cat)  // "์•ผ์˜น"

let count = 10;
count;  // 10

class Car {
  constructor(color) {
    this.color = color;
  }
}

const myNissan = new Car('red');
myNissan.color; // 'red'

 

 

TDZ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ

var, funtion, import

๋ฐ‘์—์„œ ์„ ์–ธ ํ•˜๋”๋ผ๋„ ํ˜ธ์ด์ŠคํŒ… ๋˜์–ด ์œ„์—์„œ ์‚ฌ์šฉํ•ด๋„ ์ •์ƒ ์‹คํ–‰

// Works!

value; // undefined
var value;

hello('Shin') // "Hello Shin :)"

function hello (name) {
  return `Hello ${name} :)`
}
hello('Shin') // "Hello Shin :)"

 

 

TDZ์„ ๋ชจ๋ฅธ ์ฑ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ

๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ์„ ํ•˜๋‚˜ ํ•˜๊ฒ ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ? ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ๋‹ค.

ui.toast.com

 

 

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€, ์‹คํ–‰ ์ฝ”๋“œ์— ์ œ๊ณตํ•  ์ •๋ณด๋“ค์„ ๋ชจ์•„ ๋†“์€ ๊ฐ์ฒด

 

JS ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค(๋ณ€์ˆ˜, arguments ๊ฐ์ฒด, ํ•จ์ˆ˜ ์„ ์–ธ, scope, this ๋“ฑ)์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•จ

JS ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด ์•ˆ์— ์ €์žฅํ•จ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ๊ฐ€์ง„ ๋ฒ”์œ„๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ

js ์ฝ”๋“œ ์‹คํ–‰์‹œ js์—”์ง„์˜ ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋จ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ๋…ผ๋ฆฌ์  ์Šคํƒ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง

์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ฝœ ์Šคํƒ(call stack)์— ์Œ“์˜€๋‹ค๊ฐ€, ๊ฐ€์žฅ ์œ„์— ์Œ“์—ฌ์žˆ๋Š” ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ๋™์ผํ•œ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ

์Šคํƒ์€ LIFO(Last In First Out, ํ›„์ž…์„ ์ถœ) ๊ตฌ์กฐ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ

 

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ๊ธฐ๋Š” ์‹œ์ 

1. ์ „์—ญ๊ณต๊ฐ„

=> JS ์ฝ”๋“œ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์‹คํ–‰๋  ๋•Œ

2. eval ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ

(๋ณด์•ˆ์ƒ ์ทจ์•ฝ์ ์ด ์žˆ๊ณ , ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์‚ฌ์šฉ ์•ˆํ•˜๊ณ  ์ง€์–‘ํ•˜๋Š” ๋ฐฉ๋ฒ•)

3. ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ

=> anonymous func() ์‹คํ–‰

4. { } ์ฝ”๋“œ ๋ธ”๋Ÿญ ์‚ฌ์šฉ ์‹œ

 

// ------------------------ (1)
var a = 1;
function outer() {
   function inner() {
      console.log(a);
      var a = 3;
      // ------------------ (2)
   }
   inner(); // ------------ (3)
   console.log(a);
   // --------------------- (4)
}
outer(); // --------------- (5)
console.log(a);
// ------------------------ (6)

์œ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋˜๋Š” ์‹œ์ ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ์—์„œ๋Š” ์‹คํ–‰์„ ์œ„ํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ •๋ณด๋“ค์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์Šคํƒ์— ๋จผ์ € ์Œ“๊ฒŒ ๋จ

์ฝ”๋“œ ์‹คํ–‰์‹œ ์Šคํƒ์ด ์–ด๋–ป๊ฒŒ ์Œ“์ด๋Š”์ง€ ์•Œ์•„๋ณด์ž

์ฝ”๋“œ ์‹คํ–‰์‹œ ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ ๋˜๊ณ  outer() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

outer์•ˆ์— innerํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์Šคํƒ์— ์Œ“์ด๊ณ  inner ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜์–ด ๊ฐ€์žฅ ๋จผ์ € ์Šคํƒ์—์„œ ๋น ์ง„๋‹ค.

๊ทธ๋‹ค์Œ outer ํ•จ์ˆ˜๊ฐ€ ๋น ์ง€๊ณ , ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋น ์ง€๋ฉด์„œ ์Šคํƒ์— ์ปจํ…์ŠคํŠธ๋“ค์ด ์—†์–ด์ง€๊ฒŒ ๋จ

 

โ€ป ์ฐธ๊ณ ) ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ™œ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด

๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†์Œ

 

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ตฌ์กฐ

1. Variable Environment

2. Lexical Environment

3. thisBinding

Variable Environment ์™€ Lexical Environment ์˜ ๋‚ด๋ถ€์—๋Š” envrionmentRecord ์™€ outerEnvironmentReference ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„์—์„œ ๋™์ผ

Variable Environment ๋Š” ์ตœ์ดˆ์˜ ์Šค๋ƒ…์ƒท์˜ ๊ฐœ๋…์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ปจํ…์ŠคํŠธ ์ •๋ณด์— ๋Œ€ํ•ด ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์Œ

 

 

Variable Environment

 - var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘๋˜๊ณ  ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ undefined๊ฐ€ ํ• ๋‹น

 - ์ตœ์ดˆ ์‹คํ–‰ ์‹œ์˜ ์Šค๋ƒ…์ƒท์„ ์œ ์ง€

 

Lexical Environment

 - let, const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘๋˜๊ณ  ์ดˆ๊ธฐ๊ฐ’์€ ํ• ๋‹น๋˜์ง€ ์•Š์Œ

 - ํ•จ์ˆ˜ ์„ ์–ธ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘๋˜๊ณ  ํ•จ์ˆ˜ ์ „์ฒด๊ฐ€ ํ• ๋‹น

 - let๊ณผ const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ Block scope๋ฅผ ๋‹จ์œ„๋กœ ํ•จ

 

๊ฐ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฒ”์œ„๋ฅผ Scope ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ํ˜„์žฌ Scope์—์„œ ์„ ์–ธ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•œ๋‹ค๋ฉด ์ƒ์œ„์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก outerEnvironmentReference ๊ฐ€ ์Šค์ฝ”ํ”„์ฒด์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•จ

 

 

envrionmentRecord

 - ํ•ด๋‹น Lexical Environment/Variable Environment์˜ scope ์•ˆ์—์„œ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ํ•จ์ˆ˜(ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์ œ์™ธ) ๋“ฑ์˜ ์‹๋ณ„์ž(Identifier) ์ •๋ณด๋“ค์„ ์ €์žฅ

 - ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์œผ๋ฉฐ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ์ˆ˜์ง‘

 - ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์ „์—ญ ๊ฐ์ฒด(Global Object: window or global) ์•ˆ์— ์œ„ ์ •๋ณด๋“ค์„ ์ €์žฅ

 - ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒ

 

Environment Record ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด์„œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—๋„ ์ฝ”๋“œ์˜ ์‹๋ณ„์ž๋“ค์„ ๋ชจ๋‘ ๋‹ค ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋จ(ํ˜ธ์ด์ŠคํŒ…)

ThisBingding ๊ฐ’์„ ํฌํ•จํ•จ

function a (x) {
  console.log(x);
  var a = 1;
  var b = 2;
  function foo() {
    console.log('work');
  };
}

a(1);

์œ„์˜ ์ฝ”๋“œ์—์„œ, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ EnvironmentRecord์—๋Š” ์‹๋ณ„์ž x, a, b์™€ ํ•จ์ˆ˜ foo๊ฐ€ ์ˆ˜์ง‘

EnvironmentRecord๋Š” ํ˜„์žฌ ์‹คํ–‰๋  ์ปจํ…์ŠคํŠธ์˜ ๋Œ€์ƒ ์ฝ”๋“œ ๋‚ด์— ์–ด๋–ค ์‹๋ณ„์ž๋“ค์ด ์žˆ๋Š”์ง€๋งŒ์„ ๋จผ์ € ์ˆ˜์ง‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜๋ฅผ ์ธ์‹ํ•  ๋•Œ ์‹๋ณ„์ž๋งŒ ๋Œ์–ด์˜ฌ๋ฆฌ๊ณ  ํ• ๋‹น ๊ณผ์ •์€ ์›๋ž˜ ์ž๋ฆฌ์— ์ˆœ์„œ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘ (ํ˜ธ์ด์ŠคํŒ… ๊ฐœ๋…)

 

outerEnvironmentReference

Lexical scope(or static scope)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„ scope์˜ Lexical Environment๋ฅผ ์ฐธ์กฐ

์ฆ‰, ํ˜ธ์ถœ๋˜๋ฉด์„œ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐ

ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ Lexical Environment๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ๋กœ, ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ

์Šค์ฝ”ํ”„์™€ ์Šค์ฝ”ํ”„์ฒด์ธ์ด ํ˜•์„ฑ

 

scope chain

 - ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์•ˆ์—์„œ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด๋‚˜๋Š” ๊ฒƒ

 - ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด outerEnvironmentReference์ด๋‹ค.

 

 

thisBinding

ํ˜„์žฌ ์ด ์ปจํ…์ŠคํŠธ๊ฐ€ ์–ด๋–ค this ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ƒ๊ธฐ๊ณ  ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ๊ธธ ๋•Œ this ๊ฐ’์ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์—, this ๊ฐ’์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฒฐ์ •๋จ. ์ฆ‰, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ this ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋จ

๊ธฐ๋ณธ์ ์œผ๋กœ this ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์—ญ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋จ

js์˜ this๋Š” ์–‘์ด ๋ฐฉ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ์ž์„ธํžˆ ๊ธฐ๋ก ์˜ˆ์ •

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (execution context)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข€๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ํŒŒ๋ด…์‹œ๋‹น! 1. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” '์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ'์„ ๋งํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹คํ–‰ ์ปจํ…

velog.io

 

[JS] ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context)

์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context, EC)๋Š” ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด๋กœ, JS์˜ ๋™์  ์–ธ์–ด๋กœ์„œ์˜ ์„ฑ๊ฒฉ์„ ์ž˜ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์—์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜

hangeoreum.tistory.com

 

[JS] ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์ด๋ฒˆ ์‹œ๊ฐ„์— ์‚ดํŽด๋ณผ ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

medium.com

 

 

 

์ฝœ ์Šคํƒ(ํ˜ธ์ถœ ์Šคํƒ)

ํ˜ธ์ถœ ์Šคํƒ์ด๋ž€, ํ”„๋กœ๊ทธ๋žจ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๊ธฐ๋ก์„ ์Šคํƒ ๋งจ ์œ„์— ์ถ”๊ฐ€(Push)

์šฐ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์Šคํƒ์— ์Œ“์—ฌ์žˆ๋˜ ํ•จ์ˆ˜๋Š” ์ œ๊ฑฐ(Pop)

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋ฏ€๋กœ, ๋‹จ์ผ ํ˜ธ์ถœ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

๋‹จ์ผ ํ˜ธ์ถœ ์Šคํƒ์ด ์žˆ๋‹ค๋Š” ๋œป์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ผ(Task)๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป

 

function multiply(x, y) {
    return x * y;
}
function printSquare(x) {
    var s = multiply(x, x);
    console.log(s);
}
printSquare(5);

์—”์ง„์ด ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์—๋Š” ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์–ด์žˆ๋‹ค.

๊ฐ€์žฅ ์•„๋žซ์ค„์— printSquare ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ดํ›„ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

์Šคํƒ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ดˆ๊ณผ ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜(ํŠนํžˆ ์žฌ๊ท€๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ๋งŽ์ด ๋‚˜์˜ด)

function foo() {
    foo();
}
foo();

ํ˜ธ์ถœ ์Šคํƒ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์˜ ์‹ค์ œ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๊ณ , ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒ

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์–ธ์–ด

์ฆ‰, ํ•œ ๋ฒˆ์— ํ•œ ๊ฐ€์ง€ ์ผ ๋ฐ–์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ(like, ๋ฉ€ํ‹ฐ ํ…Œ์Šคํ‚น์ด ์•ˆ๋Œ€๋Š” ์‚ฌ๋žŒ)

 

 

๋‹จ์ผ ํ˜ธ์ถœ ์Šคํƒ์˜ ๋ฌธ์ œ์ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ˜ธ์ถœ ์Šคํƒ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์—„์ฒญ ๋Š๋ ค์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์‹คํ–‰์— ์ง€์žฅ์„ ์ค€๋‹ค๋ฉด?

 

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

 

์ฆ‰, ํ˜„์žฌ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋‹ค๋ฅธ ์ผ์„ ํ•  ์ˆ˜๊ฐ€ ์—†๊ณ , ๋‹ค๋ฅธ ์ผ๋“ค์ด ๋ธ”๋ฝ๋˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ์‹คํ–‰๋  ๊ฒฝ์šฐ, ์›น ํŽ˜์ด์ง€์˜ UI๋Š” ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๊ณ , ์‚ฌ์šฉ์ž๋Š” ์–ด๋– ํ•œ ํ–‰๋™๋„ ํ•  ์ˆ˜ ์—†๋‹ค.

 

๋˜ํ•œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์—์„œ ๋งŽ์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์‘๋‹ต์„ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์ƒํ™ฉ์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ์ข…๋ฃŒํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฌป๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œ

 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๋น„๋™๊ธฐ ์ฝœ๋ฐฑ(Asynchronous callbacks)

์šฐ๋ฆฌ์˜ ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์ค‘์— ์‹คํ–‰๋  ์ฝœ๋ฐฑ(ํ•จ์ˆ˜)๋ฅผ ์ œ๊ณต

๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์€ ์ฆ‰์‹œ๊ฐ€ ์•„๋‹Œ, ํŠน์ˆ˜ํ•œ ์‹œ์ ์— ์‹คํ–‰๋˜๋ฏ€๋กœ console.log์™€ ๊ฐ™์€ ๋™๊ธฐ ํ•จ์ˆ˜์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์Šคํƒ ์•ˆ์— ๋ฐ”๋กœ push ๋  ํ•„์š”๊ฐ€ ์—†์Œ

 

 

์ด๋ฒคํŠธ ํ(Event Queue)์™€ ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ™˜๊ฒฝ(Runtime)์€ ์ด๋ฒคํŠธ ํ(Event Queue)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด๋Š” ์ฒ˜๋ฆฌํ•  ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก๊ณผ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋“ค์˜ ๋ฆฌ์ŠคํŠธ

 

๋น„๋™๊ธฐ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณผ์ •

1. ์šฐ์„  ๋ฒ„ํŠผ ํด๋ฆญ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด DOM ์ด๋ฒคํŠธ, http ์š”์ฒญ, setTimeout ๋“ฑ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” C++๋กœ ๊ตฌํ˜„๋œ web API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ,

2. web API๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ(์ฝœ๋ฐฑ ํ)์— ๋ฐ€์–ด ๋„ฃ์Šต๋‹ˆ๋‹ค.

3. ๊ทธ๋Ÿผ ์ด๋ฒคํŠธ ํ๋Š” ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ ์Šคํƒ์ด ํ…… ๋น„๋Š” ์‹œ์ ์— ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์Šคํƒ์— ๋„ฃ์Œ).

4. ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๊ธฐ๋ณธ ์—ญํ• ์€ ํ์™€ ์Šคํƒ, ๋‘ ๋ถ€๋ถ„์„ ์ง€์ผœ๋ณด๋‹ค๊ฐ€ ์Šคํƒ์ด ๋น„๋Š” ์‹œ์ ์— ์ฝœ๋ฐฑ์„ ์‹คํ–‰์‹œ์ผœ ์ฃผ๋Š” ๊ฒƒ. ๊ฐ ๋ฉ”์‹œ์ง€์™€ ์ฝœ๋ฐฑ์€ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „์— ์™„์ „ํžˆ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 

 

์ง„์งœ! ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ์›๋ฆฌ

๋„ˆ๋ฌด๋‚˜๋„ ์–ด๋ ค์šด ๋น„๋™๊ธฐ ๋™์ž‘ ๋ฟŒ์‹œ๊ธฐ

blog.toycrane.xyz

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ถœ ์Šคํƒ(Call Stack) ์ดํ•ดํ•˜๊ธฐ

์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹ฌ๋„ ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด "๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผํ•  33๊ฐ€์ง€ ๊ฐœ๋…(https://github.com/yjs03057/33-js-concepts)"์˜ ํ•ญ๋ชฉ๋“ค๊ณผ ๋งํฌ๋˜์–ด์žˆ๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€๋“ค์„ ์ •๋ฆฌ

new93helloworld.tistory.com

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์€๋‹‰ํ™”

์€๋‹‰ํ™”๋ž€, ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ๋˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ง‰๋Š” ๊ฒƒ(์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌ)

๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ ์˜์กด์„ฑ, ์ฆ‰ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ํšจ๊ณผ

 

 

ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜์˜ ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์€๋‹‰ํ™”

(function () {
  var a = 'a';
})();

console.log(a); // a is not defined

 

 

 

๐Ÿค ์‹ค์Šต ๊ณผ์ œ

 

์ฝ˜์†”์— ์ฐํž b ๊ฐ’์„ ์˜ˆ์ƒํ•ด๋ณด๊ณ , ์–ด๋””์—์„œ ์„ ์–ธ๋œ “b”๊ฐ€ ๋ช‡๋ฒˆ์งธ ๋ผ์ธ์—์„œ ํ˜ธ์ถœํ•œ console.log์— ์ฐํ˜”๋Š”์ง€,

์™œ ๊ทธ๋Ÿฐ์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”. ์ฃผ์„์„ ํ’€์–ด๋ณด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ง€ ์„ค๋ช…ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”.

let b = 1;

function hi () {

const a = 1;

let b = 100;

b++;

console.log(a,b);

}

// console.log(a); // Uncaught ReferenceError: a is not defined

console.log(b); // 1

hi(); // 1,101

console.log(b); // 101

------

// ์ฒซ์ค„์—์„œ let์œผ๋กœ b๋Š” 1์ด๋ผ๊ณ  ํ• ๋‹น(์„ ์•ˆ๋ฐ ์ดˆ๊ธฐํ™”) ํ•ด์ฃผ์—ˆ๊ณ  
// hiํ•จ์ˆ˜ ์•ˆ์—์„œ a, b๋ฅผ 1๊ณผ 100์œผ๋กœ ์žฌ ์„ ์–ธ๋ฐ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์—ˆ๋‹ค

// ๊ทธํ›„ b++๋กœ 100์— 1์„ ๋”ํ•œ ๊ฐ’์ด b๊ฐ€ ๋˜์—ˆ์ง€๋งŒ 
// ์ด๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ฒŒ์–ด์ง„ ์ผ ๋ฐ–์— ์˜ํ–ฅ์„ ์•„์ง ์ฃผ์ง„ ์•Š์•˜๋‹ค


// console.log(a)๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์—ˆ์ง€๋งŒ,
// ์•„์ง ํ•จ์ˆ˜ ์‹คํ–‰ ์ „์ด๋ผ์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

// console.log(b)๋Š” ์ฒ˜์Œ์— ํ• ๋‹นํ•œ b=1์ด ๋ ๊ฒƒ์ด๊ณ 

// hi ํ•จ์ˆ˜ ๋ฅผ ์‹คํ–‰ ํ•˜๋ฉด์„œ a,b๊ฐ€ ์„  ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๊ณ  b++์ด ๋˜๊ณ  
// ๊ทธ ์•ˆ์—์„œ console.log(a, b) ๋ฅผ ํ•ด์„œ 1,101์ด ์ฐํžˆ๊ณ 

// ๋งˆ์ง€๋ง‰ console.log(b)์—์„œ hiํ•จ์ˆ˜๋กœ b์˜ ๊ฐ’์ด 101๋กœ ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 101์ด ์ฐํžŒ๋‹ค.