๐Ÿ“ŒLanguage/JavaScript

TIL) ์Šค์ฝ”ํ”„์˜ ์ฃผ์š”๊ทœ์น™, ๋ธ”๋ก ์Šค์ฝ”ํ”„์™€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„, ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ์Šค์ฝ”ํ”„, ๋ณ€์ˆ˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

hellohailie 2022. 5. 12. 17:16

๋ชฉํ‘œ

์Šค์ฝ”ํ”„์˜ ์˜๋ฏธ์™€ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์ดํ•ดํ•œ๋‹ค.
์Šค์ฝ”ํ”„์˜ ์ฃผ์š” ๊ทœ์น™์„ ์ดํ•ดํ•œ๋‹ค.
์ „์—ญ ์Šค์ฝ”ํ”„์™€ ์ง€์—ญ ์Šค์ฝ”ํ”„์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•œ๋‹ค.
block scope์™€ function scope์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•œ๋‹ค.
๋ณ€์ˆ˜ ์„ ์–ธ ํ‚ค์›Œ๋“œ(let, const, var)์™€ ์Šค์ฝ”ํ”„์™€์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์Šค์ฝ”ํ”„๋ž€?


์Šค์ฝ”ํ”„์˜ ์ •์˜: ๋ณ€์ˆ˜ ์ ‘๊ทผ ๊ทœ์น™์— ๋”ฐ๋ฅธ ์œ ํšจ ๋ฒ”์œ„
๋ฒ”์œ„๊ฐ€ ์ค‘๊ด„ํ˜ธ(๋ธ”๋ก) ๋˜๋Š” ํ•จ์ˆ˜์— ์˜ํ•ด ๋‚˜๋ˆ„์–ด์ง€๊ณ , ๊ทธ ๋ฒ”์œ„๋ฅผ ์Šค์ฝ”ํ”„๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

๊ทœ์น™1.
๋ฐ”๊นฅ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์•ˆ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์•ˆ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ฐ”๊นฅ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

๊ทœ์น™2.
์Šค์ฝ”ํ”„๋Š” ์ค‘์ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๊ทœ์น™3.
๊ฐ€์žฅ ๋ฐ”๊นฅ์˜ ์Šค์ฝ”ํ”„๋Š” ํŠน๋ณ„ํžˆ ์ „์—ญ ์Šค์ฝ”ํ”„ (Global scope)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์œ„์—์„œ๋Š” scope1์ด ์ „์—ญ ์Šค์ฝ”ํ”„์ด๋‹ค.

๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ์ง€์—ญ ์Šค์ฝ”ํ”„(Local scope)๋ผ๊ณ  ํ•œ๋‹ค. ์œ„์—์„œ๋Š” scope2,3,4๊ฐ€ ์ง€์—ญ ์Šค์ฝ”ํ”„์ด๋‹ค.

 

๊ทœ์น™4.

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

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

 

let name = 'Hailie'; // ์ „์—ญ ๋ณ€์ˆ˜
function showName() {
	let name = 'frontendEngineer'; // ์ง€์—ญ ๋ณ€์ˆ˜
}

 


์˜ˆ์ œ๋กœ ๊ฐœ๋… ์žก๊ธฐ1

let name = 'Hailie'; // ์ „์—ญ ๋ณ€์ˆ˜

function showName() {
  let name = 'frontendEngineer'; // ์ง€์—ญ ๋ณ€์ˆ˜
  console.log(name); // ์ถœ๋ ฅ์‹œ 'frontendEngineer' ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์ „์—ญ ๋ณ€์ˆ˜์™€ ๋˜‘๊ฐ™์ง€๋งŒ, ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋‹ˆ๊นŒ
}

console.log(name); // ์ถœ๋ ฅ์‹œ 'Hailie'
showName();
console.log(name); // ์ถœ๋ ฅ์‹œ 'Hailie'

 

 ๋™์ผํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ๋ฐ”๊นฅ์ชฝ ๋ณ€์ˆ˜๊ฐ€ ์•ˆ์ชฝ ๋ณ€์ˆ˜์— ์˜ํ•ด ๊ฐ€๋ ค์ง€๋Š”(shadow) ํ˜„์ƒ์„ ์‰๋„์ž‰(variable shadowing)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

์˜ˆ์ œ๋กœ ๊ฐœ๋… ์žก๊ธฐ2

let name = 'Hailie'; // ์ „์—ญ ๋ณ€์ˆ˜

function showName() {
  name = 'frontendEngineer'; // ์ง€์—ญ ๋ณ€์ˆ˜
  console.log(name); // ์ถœ๋ ฅ์‹œ 
}

console.log(name); // ์ถœ๋ ฅ์‹œ 'Hailie'
showName();
console.log(name); // ์ถœ๋ ฅ์‹œ 'frontendEngineer'

 

์„ธ ๋ฒˆ์งธ ์ค„์—์„œ let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด๋Š”, 'frontendEngineer'๋ผ๋Š” ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•˜๊ณ  ์žˆ๋Š” name ๋ณ€์ˆ˜๋Š” ์ „์—ญ์— ์„ ์–ธ๋œ name ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋‹ค!

 

 

 

์Šค์ฝ”ํ”„์˜ ์ข…๋ฅ˜

๋ธ”๋ก ์Šค์ฝ”ํ”„(block scope) : ์ค‘๊ด„ํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฒ”์œ„๊ฐ€ ๊ตฌ๋ถ„๋œ๋‹ค. 

ex) ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(์œ ์˜)

 

ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„(function scope) 

ex) function ํ‚ค์›Œ๋“œ๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ํ•จ์ˆ˜ ์„ ์–ธ์‹ ๋ฐ ํ•จ์ˆ˜ ํ‘œํ˜„์‹

 

let getAge = user => {
	return user.age;
} // ๊ฐ™์€ ํ•จ์ˆ˜์—ฌ๋„, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ์Šค์ฝ”ํ”„๋กœ ์ทจ๊ธ‰๋œ๋‹ค. 

let getAge = function (user) {
	return user.age;
} // function ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„

 

  • let, const ํ‚ค์›Œ๋“œ๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋”ฐ๋ฅธ๋‹ค. ์ถ”๊ฐ€๊ณต๋ถ€
  • var ํ‚ค์›Œ๋“œ๋กœ ์ •์˜ํ•œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๋ฌด์‹œํ•˜๊ณ , ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋งŒ ๋”ฐ๋ฅธ๋‹ค.๊ทธ๋Ÿฌ๋‚˜, ๋ชจ๋“  ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋Š” ๋ฌด์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

var ํ‚ค์›Œ๋“œ๋ณด๋‹ค letํ‚ค์›Œ๋“œ๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ 

 

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

2. let ํ‚ค์›Œ๋“œ๋Š” ์žฌ์„ ์–ธ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. (var ํ‚ค์›Œ๋“œ๋Š” ์žฌ์„ ์–ธํ•ด๋„ ์—๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค. )

 

 

 

const ํ‚ค์›Œ๋“œ๋Š” ์–ธ์ œ ์“ธ๊นŒ?

 

๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’, ๊ณง ์ƒ์ˆ˜(constant)๋ฅผ ์ •์˜ํ•  ๋•Œ์—๋Š” const๋ฅผ ์ด์šฉํ•œ๋‹ค. 

const๋Š” ๊ฐ’์˜ ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ๊ฒฝ์šฐ TypeError๋ฅผ ๋‚ด๋ฏ€๋กœ, ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

  let const var
์œ ํšจ ๋ฒ”์œ„ ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ฐ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ฐ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ & ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
๊ฐ’ ์žฌํ• ๋‹น ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ
์žฌ์„ ์–ธ ๋ถˆ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ

 

 

 

๋ณ€์ˆ˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. ์ „์—ญ ๋ณ€์ˆ˜ ์ตœ์†Œํ™”ํ•˜๊ธฐ

   ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•œ ๋Œ€์‹ , ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜น์€ ๋กœ์ง์— ์˜ํ•ด ์˜๋„๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

    2. var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” window ๊ฐ์ฒด์— ์†ํ•œ ๋ณ€์ˆ˜, ์ฆ‰ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ var๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. // var๋กœ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ window ๊ธฐ๋Šฅ์„ ๋ฎ์–ด์”Œ์›Œ์„œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ํ• ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

(์ถ”๊ฐ€๊ณต๋ถ€)

  • Window ๊ฐ์ฒด๋Š” only ๋ธŒ๋ผ์šฐ์ €์—๋งŒ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €์˜ ์ฐฝ(window)๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ๋ณ„๊ฐœ๋กœ ์ „์—ญ ์˜์—ญ์„ ๋‹ด๊ณ  ์žˆ๊ธฐ๋„ํ•˜๋‹ค.
  • ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜ ์„ ์–ธ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ var ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด window ๊ฐ์ฒด์— ์†ํ•ด์ง„๋‹ค.

 

 

    3. ์„ ์–ธ ์—†๋Š” ๋ณ€์ˆ˜ ํ• ๋‹น ๊ธˆ์ง€! // ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด์„œ ๋งˆ์น˜ var๋กœ ์„ ์–ธ๋œ ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค. 

 ํŒ)js ํŒŒ์ผ ์ƒ๋‹จ์— 'use strict' ์ž…๋ ฅํ•˜๋ฉด ์‹ค์ˆ˜๋ฐฉ์ง€ ๊ฐ€๋Šฅ!

 

    4. ๋ณ€์ˆ˜๋ณด๋‹ค๋Š” ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ์–ต์ œํ•˜์ž. const

 

    5. ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋ณ€์ˆ˜์˜ ๋ชฉ์ ์ด๋‚˜ ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„ค์ด๋ฐํ•˜์ž. 

 

 

 

๊ฐ€๋…์„ฑ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค!



์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•˜๋Š” ์ฝ”๋“œ๋Š” ์–ด๋–ค ๋ฐ”๋ณด๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ›Œ๋ฅญํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์“ด๋‹ค.
by. Martin Fowler <๋ฆฌํŒฉํ† ๋ง>์˜ ์ €์ž