Scope, ์˜์—ญ

๐Ÿ˜‚ ์ด์ „ ์‹คํ–‰์ปจํ…์ŠคํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ, Scope๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ ‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด ์šฉ์–ด๋Š” ์•„๋‹ˆ์˜€์ง€๋งŒ, ์ง€๊ธˆ์ƒ๊ฐํ•ด๋ณด๋‹ˆScope๋ฅผ ๋จผ์ € ์•Œ๊ณ  ์‹คํ–‰์ปจํ…์ŠคํŠธ๋ฅผ ๊ณต๋ถ€ํ–ˆ๋‹ค๋ฉด ๋” ์ˆ˜์›”ํ–ˆ์„ ๋“ฏ ํ•˜๋‹ค.

Scope(์˜์—ญ)

Scope๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ ์–ธํ–ˆ์„ ๋•Œ ์ •ํ•ด์ง„๋‹ค๊ณ  ํ–ˆ์—ˆ์Œ.

// 1๋ฒˆ
var name = 'zero'
function wrapper() {
  var name = 'nero'
  function log() {
    console.log(name)
  }
  log()
}
wrapper() // nero

// 2๋ฒˆ
var name = 'zero'
function log() {
  console.log(name)
}
function wrapper() {
  var name = 'nero'
  log()
}
wrapper() // zero

1๋ฒˆ

1๋ฒˆ์—์„œ function log์ธ ํ•จ์ˆ˜์„ ์–ธ์‹์€, wrapper ํ•จ์ˆ˜ ์•ˆ์—์žˆ๊ธฐ ๋•Œ๋ฌธ์—, wrapper์˜ ๋‚ด๋ถ€๊นŒ์ง€๊ฐ€ Scope์˜์—ญ์ž„. ๋”ฐ๋ผ์„œ, var name="nero" ๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋‹ด๊ธดํด๋กœ์ €์— ์ ‘๊ทผํ•  ์ˆ˜์žˆ์Œ.

2๋ฒˆ

2๋ฒˆ์—์„œ function log์ธ ํ•จ์ˆ˜์„ ์–ธ์‹์€, ์ „์—ญ์— ์œ„์น˜ํ•˜๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ „์—ญ๋ณ€์ˆ˜์ธ var name="zero"๋ฟ์ด์—ฌ์„œ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค.

์ „์—ญ๋ณ€์ˆ˜์˜ ์œ„ํ—˜์„ฑ

์ „์—ญ๋ณ€์ˆ˜๋Š” window ๊ฐ์ฒด์— ์ถ”๊ฐ€๋˜๊ธฐ๋•Œ๋ฌธ์—, ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
var ๋Š” window๊ฐ์ฒด์— ํฌํ•จ๋˜์ง€๋งŒ, let, const๋Š” ๋ณ„๋„์˜ ๊ฐ์ฒด์— ์ถ”๊ฐ€๋จ. ๋”ฐ๋ผ์„œ, const let์€ ๊ดœ์ฐฎ์€๊ฒƒ ๊ฐ™๋”๋ผ.

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค : ๋ณ€์ˆ˜๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ป์งˆ ์ œ์ž‘.
var param = {
  text: 'local',
  alertText: function() {
    console.log(this.text)
  },
}

ํ•˜์ง€๋งŒ, ์œ„์˜ ๊ฒฝ์šฐ, ์ถ”๊ฐ€์ ์œผ๋กœ script๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ, x์™€ y๋ฅผ ๊ณ ์˜์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. obj.text = 'fuck' ์ด๋Ÿฐ์‹์œผ๋กœ

๐Ÿ˜† ํ•ด๊ฒฐ๋ฐฉ์•ˆ

๋น„๊ณต๊ฐœ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

const param = (() => {
  // 1. param์ด๋ผ๋Š” ๋ณ€์ˆ˜์—, ๋น„๊ณต๊ฐœ๋ณ€์ˆ˜๋ฅผ Closure๋กœ ๊ฐ–๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  let text = 'local'
  return {
    alertText: function() {
      console.log(text)
    },
  }
})()
param.alertText() // 2. ํ•„์š”ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿง ์˜๋ฌธ

์‹คํ–‰์ปจํ…์ŠคํŠธ์™€ ์ด๋ฒˆ ์Šค์ฝ”ํ”„๋ฅผ ํ•˜๋ฉด์„œ ์ปจํ…์ŠคํŠธ์—์„œ ์ƒ์„ฑ๋˜๋Š” [[Scopes]]๊ฐ์ฒด์—์„œ closure๋ผ๋Š” ๊ฐ’์„ ๋ณด์•˜๊ณ , ์ด๋ฒˆ์—๋„ ์Šค์ฝ”ํ”„ ์˜์—ญ ๋‚ด์˜ ๋ณ€์ˆ˜๋ฅผ closure๋ผ๊ณ  ํ•˜๋Š”๊ฑธ ๋ณด์•˜๋‹ค. ๋‹ค์Œ๋ฒˆ์—๋Š” closure๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์•„์•ผ ๊ฒ ๋‹ค.


@SangMin
๐Ÿ‘† H'e'story

๐Ÿš€GitHub