TIL/JS 2023/3/14 ๐Ÿ“š

๋ฐ•์ƒํ•˜ยท2023๋…„ 3์›” 14์ผ
0

TILย  CS/JS

๋ชฉ๋ก ๋ณด๊ธฐ
2/22

์˜ค๋Š˜์€ ์–ด์ œ ๋ฐฐ์› ๋˜ JS ๊ธฐ์ดˆ ์ง€์‹์„ ๋ณต์Šต ํ•œ ํ›„ ํด๋กœ์ €์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ๋‹ค!!
๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ˜ธ๊ธฐ๋กญ๊ฒŒ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ํด๋กœ์ €๋ฅผ ์•Œ๊ธฐ์œ„ํ•ด ์•Œ์•„์•ผํ•  ์ง€์‹๋“ค์ด ๋น„์–ด์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋๋‹ค,,๐Ÿ˜‚
์˜คํžˆ๋ ค ์ข‹๋‹ค!! ๋‚ด๊ฐ€ ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„์„ ๊ณ„์†ํ•ด์„œ ์—ฐ๊ฒฐ๋˜์–ด ์•Œ๊ฒŒ๋˜๋Š” ๊ฒƒ์ด๋‹ˆ ์•„์ฃผ ์ข‹์€ ์ฒด์ด๋‹..์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์•ผ๊ฒ ๋‹ค.

๋จผ์ € ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ดํ•ดํ•ด์•ผํ–ˆ๊ณ  ์ปจํ…์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ์œ„ํ•ด ์Šค์ฝ”ํ”„๋ฅผ ์ดํ•ดํ•ด์•ผํ–ˆ๊ณ  ์Šค์ฝ”ํ”„๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ดํ•ดํ•ด์•ผํ–ˆ๋‹ค.

์˜ค๋Š˜์˜ ํ•™์Šต ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜ => ์Šค์ฝ”ํ”„ => ์ปจํ…์ŠคํŠธ => ํด๋กœ์ €

์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜โ“

์ดํ•˜ ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋งŽ์€ ๋„์›€์„ ์ค€ ๋ธ”๋กœ๊ทธ๊ฐ€ ์žˆ๋‹ค.
๋„์›€์„ ๋ฐ›์€ ์ œ๋กœ์ดˆ๋‹˜ ๋ธ”๋กœ๊ทธ

๋ณ€์ˆ˜๋Š” ์œ ํšจ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค!!

์‰ฝ๊ฒŒ ๋งํ•ด ํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜
ํ•จ์ˆ˜ ๋ฐ”๊นฅ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜์ด๋‹ค.

IN ํ•จ์ˆ˜ => ์ง€์—ญ๋ณ€์ˆ˜
OUT ํ•จ์ˆ˜ => ์ „์—ญ๋ณ€์ˆ˜

let x = "global"
function ex(){
let x = local
x = changed
}
ex()
console.log(x)

์œ„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ?

์ •๋‹ต์€ .. global!!

์™œ๋ƒํ•˜๋ฉด ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ 1line์˜ x์™€ function ์•ˆ์— ์กด์žฌํ•˜๋Š” x๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ด๋‹ค.
๋ณ€์ˆ˜๋Š” ์„ ์–ธ ์‹œ์ ์—์„œ ์Šค์ฝ”ํ”„๊ฐ€ ์ •ํ•ด์ง€๋Š”๋ฐ ์ด๋Š” ์กฐ๊ธˆ ์ด๋”ฐ ์ •๋ฆฌ๋ฅผ ํ• ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ changed๋ฅผ console ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด
exํ•จ์ˆ˜๋Š” x๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!!

์ง€๊ธˆ ์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฒƒ์€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ๋‹ค๋ฉด "์ง€์—ญ๋ณ€์ˆ˜"
ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์žˆ๋‹ค๋ฉด "์ „์—ญ๋ณ€์ˆ˜"

์Šค์ฝ”ํ”„โ“

์Šค์ฝ”ํ”„๋Š” ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ ๋ฒ”์œ„๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค!!
๋ณ€์ˆ˜๋Š” ์–ด๋””์„œ ์„ ์–ธ๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ทธ ์‚ฌ์šฉ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •์ด ๋œ๋‹ค..โญ•๏ธ

๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ์„ค์ • ๋ ๊นŒ?
๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ „์—ญ๋ณ€์ˆ˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ• ์ˆ˜โŒ
์ง€์—ญ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ• ์ˆ˜โญ•๏ธ

๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€๋Š” ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋Š” ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

let x = "global"
function ex(){
let x = local
x = changed
}
ex()
console.log(x)

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ดค์„ ๋•Œ ๋‚ด๋ถ€์˜ x ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ x์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค ๋งŒ์•ฝ

let x = "global"
function ex(){
console.log(x)
}
ex()

์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ๊ฒฐ๊ณผ๋Š” global์„ ์ถœ๋ ฅํ•œ๋‹ค.
๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์ „์—ญ๋ณ€์ˆ˜์ธ x๋ฅผ ์ฐธ์กฐํ•˜์—ฌ console.log(x)๋ฅผ ์ถœ๋ ฅํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

let x = "haha"
function A(){
 let y = "hoho" 
}
console.log(y)

์œ„ ํ•จ์ˆ˜์—์„œ๋Š” undefined๊ฐ€ ์ฐํžŒ๋‹ค
์™œ๋ƒํ•˜๋ฉด ๋‚ด๋ถ€์˜ y ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์Šค์ฝ”ํ”„ ์ฒด์ธโ“

์œ„ ์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜์˜ ๊ด€๊ณ„์—์„œ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋ฐœ์ƒํ•œ๋‹ค.

๋‚ด๋ถ€ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์™ธ๋ถ€ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‚ด๋ถ€ํ•จ์ˆ˜๋Š” ์—ญํ• ์ด ๋๋‚˜๋ฉด ์•ˆ์˜ ๋ณ€์ˆ˜๋„ ์ข…๋ฃŒ๋œ๋‹ค.

var name = 'zero'; // 1.์„ ์–ธ 2.ํ• ๋‹น 
// name ์ฐพ์•˜๋‹ค!!
function outer() {//3.์„ ์–ธ 4.ํ• ๋‹น
  console.log('์™ธ๋ถ€', name); // 12. ์‹คํ–‰ => name์ด ์–ด๋”จ์ง€?
  function inner() {//5.์„ ์–ธ 6.ํ• ๋‹น
    var enemy = 'nero'; // 9. ์„ ์–ธ 10.ํ• ๋‹น
    console.log('๋‚ด๋ถ€', name); // 11. ์‹คํ–‰ => name์ด ์–ด๋”จ์ง€?
  }
  inner();// 8 ์‹คํ–‰
}
outer();//7 ์‹คํ–‰
console.log(enemy); // 13. ์‹คํ–‰ undefined 
//์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€ ๋ณ€์ˆ˜ (์ง€์—ญ๋ณ€์ˆ˜)์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ!!

์œ„ ์ฃผ์„์— ๋‹ฌ์•„๋†“์€ ๋‚ด์šฉ ์ฒ˜๋Ÿผ ๋‚ด๋ถ€scope์—์„œ ์™ธ๋ถ€scope๋กœ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ณผ์ •
์ฆ‰, ๊ผฌ๋ฆฌ์— ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๊ณ  ๋ฒ”์œ„๋ฅผ ๋„“ํžˆ๋ฉด์„œ ์ฐพ์•„๋‚ด๋Š” ๊ด€๊ณ„๋ฅผ ์Šค์ฝ”ํ”„์ฒด์ธ์ด๋ผ๊ณ  ํ•œ๋‹ค!!

๋‚ด๋ถ€ scope ์—์„œ ์™ธ๋ถ€ scope๋กœ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„ ๋‚˜์„œ๋Š” ๊ด€๊ณ„๋ฅผ ์Šค์ฝ”ํ”„ ์ฒด์ธ!!

lexical scopingโ“

๋จผ์ € ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ ์–ธํ•  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค!๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

var name = 'zero';
function log() {
  console.log(name);
}// ์ด๋•Œ ์ƒ์„ฑ์‹œ์ ์—์„œ name์€ ์ „์—ญ๋ณ€์ˆ˜์ธ name์„ ๊ฐ€๋ฅดํ‚จ๋‹ค!
//

function wrapper() {
  name = 'nero';// ๊ทผ๋ฐ ๊ทธ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๊ต์ฒด
  log();// ๊ทธ๋ ‡๊ฒŒ nero๊ฐ€ ์ถœ๋ ฅ!
}
wrapper();//์—ฌ๊ธด ์‹คํ–‰์‹œ์ !
var name = 'zero';
function log() {
  console.log(name);// ์ด๋•Œ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค "zero"
}

function wrapper() {
  var name = 'nero';
  log();//์—ฌ๊ธฐ๋Š” ์‹คํ–‰์‹œ์  ์ด๋ผ ์ด๋•Œ ์Šค์ฝ”ํ”„๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค!
  //๊ทธ๋‹ˆ๊นŒ name์˜ ์˜ํ–ฅ์€ wrapper์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒ์„ฑ์‹œ์ ์ธ
  //log์—์„œ ์ด๋ฏธ ์ „์—ญ๋ณ€์ˆ˜ name์„ ๊ฐ€๋ฅดํ‚ค๊ณ ์žˆ๋‹ค.
}
wrapper();//๊ทธ๋ ‡๊ฒŒ "zero"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธํ•˜๋Š” ์‹œ์ ์—์„œ ์Šค์ฝ”ํ”„๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ํ˜„์ƒ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์Šค์ฝ”ํ”„๋ฅผ
lexical scoping์ด๋ผ๊ณ  ํ•œ๋‹ค!

์ปจํ…์ŠคํŠธโ“

์ปจํ…์ŠคํŠธ : ์ฝ”๋“œ์˜ ์‹คํ–‰ํ™˜๊ฒฝ!!

์ปจํ…์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฝ”๋“œ์˜ ์‹คํ–‰์ˆœ์„œ ์ฆ‰, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘์„ ๋”ฐ๋ผ๊ฐ€๋ฉด๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ƒ๊ฐ์„ ํ•ด๋ณด์ž!

var name = 'zero'; // 1.๋ณ€์ˆ˜์„ ์–ธ(์ดˆ๊ธฐํ™”) 6. ๋ณ€์ˆ˜ํ• ๋‹น
function wow(word) { //2.๋ณ€์ˆ˜์„ ์–ธ 3.๋ณ€์ˆ˜ํ• ๋‹น
  console.log(word + ' ' + name); //11
}
function say () { // 4.๋ณ€์ˆ˜์„ ์–ธ 5.๋ณ€์ˆ˜ํ• ๋‹น
  var name = 'nero'; // 8
  console.log(name); // 9
  wow('hello'); //10
}
say(); // 7. ํ•จ์ˆ˜์‹คํ–‰

์œ„ ์ฝ”๋“œ๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ณด๋ฉด ์ปจํ…์ŠคํŠธ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปจํ…์ŠคํŠธ

  • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ „์—ญ ์ปจํ…์ŠคํŠธ ํ•˜๋‚˜ ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งˆ๋‹ค ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ปจํ…์ŠคํŠธ๋Š” ์‚ฌ๋ผ์ง„๋‹ค. ์ „์—ญ ์ปจํ…์ŠคํŠธ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์— ์‚ฌ๋ผ์ง„๋‹ค!
  • ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์‹œ ์ปจํ…์ŠคํŠธ ์•ˆ์— ๋ณ€์ˆ˜๊ฐ์ฒด(ํ•จ์ˆ˜์ธ์ž,๋ณ€์ˆ˜), scopechain, this๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค!!
  • ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ํ›„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ, ํ•จ์ˆ˜์•ˆ์—์„œ์˜ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜์•ˆ์—์„œ ๋จผ์ € ์ฐพ๊ณ  ์—†์œผ๋ฉด ์Šค์ฝ”ํ”„์ฒด์ธ์„ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์ฐพ๋Š”๋‹ค!

๊ทธ๋Ÿผ ์œ„ ์ฝ”๋“œ์—์„œ ์–ด๋–ค ๊ฒƒ์ด ์ „์—ญ ์ปจํ…์ŠคํŠธ์ผ๊นŒ?

var name = "zero" ์˜ ๋ณ€์ˆ˜์„ ์–ธ(์ดˆ๊ธฐํ™”)
function wow(word)์˜ ์„ ์–ธ๊ณผ ํ• ๋‹น
function say()์˜ ์„ ์–ธ๊ณผ ํ• ๋‹น
---ํ˜ธ์ด์ŠคํŒ…---
var name = "zero"์˜ ๋ณ€์ˆ˜ ํ• ๋‹น


๊นŒ์ง€ ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

'์ „์—ญ ์ปจํ…์ŠคํŠธ': {
  ๋ณ€์ˆ˜๊ฐ์ฒด: {
    arguments: null,
    variable: ['name', 'wow', 'say'],
  },
  scopeChain: ['์ „์—ญ ๋ณ€์ˆ˜๊ฐ์ฒด'],
  this: window,
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ  ์—ฌ๊ธฐ์„œ this๋Š” ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•ˆํ”ใ„ด๋‹ค๋ฉด window๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค. ๋งŒ์•ฝ new๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ this๊ฐ’์„ bindํ•œ๋‹ค๋ฉด this๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ say๊ฐ€ ์„ ์–ธ๋˜๋ฉด์„œ ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ์ธ sayํ•จ์ˆ˜์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
์ด๋•Œ ์ปจํ…์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

'say ์ปจํ…์ŠคํŠธ': {
  ๋ณ€์ˆ˜๊ฐ์ฒด: {
    arguments: null,
    variable: ['name'], // ์ดˆ๊ธฐํ™” ํ›„ [{ name: 'nero' }]๊ฐ€ ๋จ
  },
  scopeChain: ['say ๋ณ€์ˆ˜๊ฐ์ฒด', '์ „์—ญ ๋ณ€์ˆ˜๊ฐ์ฒด'],
  this: window,
}

๋‹ค์Œ wow("hello") ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด wowํ•จ์ˆ˜์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์ด๋•Œ ํ•จ์ˆ˜ ์„ ์–ธ ์‹œ์ ์—์„œ ํ•ด๋‹น ์Šค์ฝ”ํ”„๊ฐ€ ์ •ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— name ๋ณ€์ˆ˜๋Š” scope chain์„ ๋”ฐ๋ผ ์ƒ์œ„ ๋ณ€์ˆ˜๊ฐ์ฒด์—์„œ ์ฐพ๊ฒŒ๋œ๋‹ค. ์ฆ‰, name์€ "zero"๊ฐ€ ๋œ๋‹ค.

'wow ์ปจํ…์ŠคํŠธ': {
  ๋ณ€์ˆ˜๊ฐ์ฒด: {
    arguments: [{ word : 'hello' }],
    variable: null,
  },
  scopeChain: ['wow ๋ณ€์ˆ˜๊ฐ์ฒด', '์ „์—ญ ๋ณ€์ˆ˜๊ฐ์ฒด'],
  this: window,

์œ„ ์ˆœ์„œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ๊ธฐ์œ„ํ•ด์„œ๋Š” ์ด๋ฒคํŠธ๋ฃจํ”„๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค

์ด๋Š” ์ด๋ฒˆ์ฃผ๋‚ด์— ๋‹ค์‹œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ฒ ๋‹ค!!

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

์–ด์ œ ๋ณ€์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ–ˆ์—ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์Šต์„ ํ•˜์ž๋ฉด

์ผ๋‹จ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚œ๋‹ค.
ํ˜ธ์ด์ŠคํŒ…์€ ๋ชจ๋“  ๋ณ€์ˆ˜์˜ ์„ ์–ธ์ด ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.

const let var์˜ ๋ณ€์ˆ˜ ์ค‘ var์™€ const,let์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

var๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜๋ฉด์„œ ์ดˆ๊ธฐํ™”๋„ ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค.
๊ทธ๋ž˜์„œ undefined๋ผ๋Š” ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ์ด ๋˜์ง€๋งŒ

const,let์€ ์„ ์–ธ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ์ด๋˜์–ด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ•จ์ˆ˜๋Š” ์–ด๋–จ๊นŒ??

ํ•จ์ˆ˜๋„ ํ˜ธ์ด์ŠคํŒ… ํ˜„์ƒ์ด ์ผ์–ด๋‚œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์„ ์–ธ์‹๊ณผ ํ‘œํ˜„์‹์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์„ ์–ธ์‹: function A(){}
ํ‘œํ˜„์‹: const A = ()=>{}

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

console.log(zero); //4. ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ผ undefined ์•„์ง ํ• ๋‹นx
sayWow(); // ์ •์ƒ์ ์œผ๋กœ wow //5. ์‹คํ–‰
function sayWow() { //์„ ์–ธ์‹ ์ด๊ฒŒ ๋งจ ์œ„๋กœ 1. ์„ ์–ธ 2. ํ• ๋‹น(๋Œ€์ž…)
  console.log('wow'); //6
}
var zero = 'zero';// 3. ๋ณ€์ˆ˜ ์„ ์–ธ 7. ํ• ๋‹น

์‹คํ–‰์ˆœ์„œ๋Œ€๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

function sayWow() {
  console.log('wow');
}
var zero;
console.log(zero);
sayWow();
zero = 'zero';

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ???

sayWow(); // (3)
sayYeah(); // (5) ์—ฌ๊ธฐ์„œ ๋Œ€์ž…๋˜๊ธฐ ์ „์— ํ˜ธ์ถœํ•ด์„œ ์—๋Ÿฌ
var sayYeah = function() { // (1) ์„ ์–ธ (6) ๋Œ€์ž…
  console.log('yeah');
}
function sayWow() { // (2) ์„ ์–ธ๊ณผ ๋™์‹œ์— ๋Œ€์ž…๋„ ์ด๋ฃจ์–ด์ง
  console.log('wow'); // (4)
}

์ด๋ ‡๊ฒŒ ํ‘œํ˜„์‹๊ณผ ์„ ์–ธ์‹์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ƒฅ ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ž

์„ ์–ธ์‹์€ ํ†ต์œผ๋กœ ๋งจ์œ„๋กœ!
ํ‘œํ˜„์‹์€ ์„ ์–ธ๋งŒ ๋งจ์œ„๋กœ!

ํด๋กœ์ €โ“

ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜๊ธฐ์œ„ํ•ด ์œ„ ๋‚ด์šฉ๋“ค์„ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค!!๐Ÿ˜Š

ํด๋กœ์ €๋Š” ์‚ฌ์‹ค ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•œ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ”ํ›„์— ์ˆ˜์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค!
ํ•˜์ง€๋งŒ ์ง€๊ธˆ ํ•„์ž๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”๋กœ ์ •์˜ํ•ด๋ณด๊ฒ ๋‹ค!!

ํด๋กœ์ € : ์–ด๋–ค Aํ•จ์ˆ˜์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜ B๋ฅผ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ Aํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ๋ณ€์ˆ˜ a๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”ํ˜„์ƒ!
-์ถœ์ฒ˜- ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

์œ„ ๋ง์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์ปจํ…์ŠคํŠธ , ์Šค์ฝ”ํ”„๋“ฑ์„ ์•Œ์•„์•ผํ•œ๋‹ค.

์ฝ”๋“œ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด

function A(){
 const a = "123" 
 function a(){
  return a+1 
 }
  return a()
}
const number = A()
console.log(number) // 2
//a์˜ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

A ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” aํ•จ์ˆ˜๋Š” lexical scoping์— ๋”ฐ๋ผ์„œ a๋ฅผ ํ•จ์ˆ˜ A์—์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ๋œ๋‹ค.(scope chain) ๊ทธ๋ ‡๋‹ค๋ฉด aํ•จ์ˆ˜๋Š” a์— +1 ์„ ๋”ํ•œ ๊ฐ’์„ return ํ•˜๋Š”๋ฐ A๋Š” ์ด๋Ÿฌํ•œ aํ•จ์ˆ˜๋ฅผ return ํ•˜์—ฌ
ํ•จ์ˆ˜ ์™ธ๋ถ€ ์ฆ‰, A์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ์œ„ a๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋Š” ์ œ๊ฑฐ๋˜๋Š”๋ฐ ๊ทธ๋Ÿผ์—๋„ a๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ด๋‹์— ์˜ํ•ด ์‚ด์•„๋‚จ๊ฒŒ๋œ๋‹ค!! ์ด๊ฒƒ์ด ํด๋กœ์ €์ด๋‹ค.

๊ฒฐ๊ตญ ํด๋กœ์ €๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ด๋‹์„ ์ด์šฉํ•œ ๋ณ€์ˆ˜ ๋นผ๋Œ๋ฆฌ๊ธฐ? ์ด๋‹ค ใ…Žใ…Ž

๋ณดํ†ต์€ ํ•จ์ˆ˜ ๋ฆฌํ„ด์„ ํ†ตํ•ด ํด๋กœ์ €๋ฅผ ๋งŒ๋“œ๋Š” ์‚ฌ๋ก€๊ฐ€ ๊ฐ€์žฅ ๋งŽ๋‹ค!!

์ฐธ๊ณ ํ•œ๋ธ”๋กœ๊ทธ-์บกํ‹ดํŒ๊ต
์ฐธ๊ณ ํ•œ๋ธ”๋กœ๊ทธ-ํ•˜๋‚˜๋ชฌ
์ฐธ๊ณ ํ•œ๋ธ”๋กœ๊ทธ-์ œ๋กœ์ดˆ

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