๐Ÿ“’

Scope

Scope๋ž€?

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

Scope Chain

๋ชจ๋“  ์Šค์ฝ”ํ”„๋Š” ํ•˜๋‚˜์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉฐ, ๋ชจ๋“  ์ง€์—ญ ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„
์ด๋ ‡๊ฒŒ ์Šค์ฝ”ํ”„๊ฐ€ ๊ณ„์ธต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๊ณ  ํ•œ๋‹ค.
์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ ์œ ํšจํ•œ ๋ณ€์ˆ˜๋Š” ํ•˜์œ„ ์Šค์ฝ”ํ”„์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•˜์œ„ ์Šค์ฝ”ํ”„์—์„œ ์œ ํšจํ•œ ๋ณ€์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

Scope์˜ ์ข…๋ฅ˜

scope๋Š” ์œ ํšจ ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋ธ”๋ก ์Šค์ฝ”ํ”„์™€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

block-level scope ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์œ ํšจํ•œ( = ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š”) ์Šค์ฝ”ํ”„
์ค‘๊ด„ํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Šค์ฝ”ํ”„์˜ ๋ฒ”์œ„๊ฐ€ ๊ตฌ๋ถ„๋˜๋ฉฐ, ์ค‘๊ด„ํ˜ธ ์•ˆ์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๊ทธ ์ค‘๊ด„ํ˜ธ ์•ˆ์—์„œ๋งŒ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ C-family language๊ฐ€ ์ด ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค.

function-level scope ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์œ ํšจํ•œ ์Šค์ฝ”ํ”„
function์„ ๊ธฐ์ค€์œผ๋กœ ์Šค์ฝ”ํ”„์˜ ๋ฒ”์œ„ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
JS์˜ var๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฆ„(let์€ ๋ธ”๋ก ์Šค์ฝ”ํ”„)
๋˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์Šค์ฝ”ํ”„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

Dynamic scope ๋™์  ์Šค์ฝ”ํ”„

ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„ ๊ฒฐ์ •

Lexical scope ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ / Static scope ์ •์  ์Šค์ฝ”ํ”„

ํ•จ์ˆ˜๋ฅผ ์–ด๋””์— ์„ ์–ธํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„ ๊ฒฐ์ •
JS๋ฅผ ๋น„๋กฏํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์ด๋‹ค.

scope ๊ทœ์น™

1. ๋ฐ”๊นฅ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์•ˆ์ชฝ ์Šค์ฝ”ํ”„์—์„œ ์‚ฌ์šฉ โญ•๏ธ ๋ฐ˜๋ฉด์—, ์•ˆ์ชฝ์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ฐ”๊นฅ์ชฝ ์Šค์ฝ”ํ”„์—์„œ๋Š” ์‚ฌ์šฉ
2. ์Šค์ฝ”ํ”„๋Š” ์ค‘์ฒฉ ๊ฐ€๋Šฅ 3. ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ์˜ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„(Global scope), ์—ฌ๊ธฐ์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜ ์ „์—ญ์ด ์•„๋‹Œ ์Šค์ฝ”ํ”„๋Š” ์ง€์—ญ ์Šค์ฝ”ํ”„(Local scope)๋กœ ์—ฌ๊ธฐ์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜ 4. ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ณด๋‹ค ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ๊ฒฝ์šฐ, ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์šฐ์„ ํ•จ

in JavaScript

function-level scope

JavaScript๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค.
ํ•จ์ˆ˜ ์„ ์–ธ์‹์ด๋‚˜ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” function ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๊ฐ€ ์•„๋‹Œ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
โ—๏ธ๊ทธ๋Ÿฌ๋‚˜ ECMAScript6๋ถ€ํ„ฐ ๋„์ž…๋œ let์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Lexical scope

JavaScript๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค.
๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ์„ ์–ธํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.
var x = 1; function foo() { var x = 10; bar(); } function bar() { console.log(x); } foo(); // 1 bar(); // 1
JavaScript
๋ณต์‚ฌ
์œ„ ์ฝ”๋“œ์—์„œ bar ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ธ”๋ก ๋‚ด์— ์„ ์–ธ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์„ ์–ธ ์œ„์น˜์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ์ด๋‹ค.
bar ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ 1์ด ์ถœ๋ ฅ๋˜๋ฏ€๋กœ foo ํ•จ์ˆ˜ ๋‚ด์˜ bar ํ•จ์ˆ˜๋„ 1์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.
๋งŒ์•ฝ ๋™์  ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–จ๊นŒ?
bar ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์œ„์น˜์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” foo ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ foo ํ•จ์ˆ˜๋Š” 10์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.
์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๊ฒฐ์ •๋จ. ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์‹คํ–‰๋˜์–ด ์ƒ์„ฑ๋œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์ฐธ์กฐํ•ด์•ผํ•˜๋ฏ€๋กœ ์ด๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค. โ†’ closure
ํ˜ธ์ด์ŠคํŒ…์€ ์Šค์ฝ”ํ”„ ๋‹จ์œ„๋กœ ๋™์ž‘
var x = 'hi'; function foo() { console.log(x); var x = 'bye'; // var ํ‚ค์›Œ๋“œ์ด๋ฏ€๋กœ undefined ์ดˆ๊ธฐํ™” } foo(); // undefined console.log(x) // 'hi'
JavaScript
๋ณต์‚ฌ

๋ณ€์ˆ˜ ์„ ์–ธ ํ‚ค์›Œ๋“œ

let

๋ธ”๋ก ์Šค์ฝ”ํ”„์™€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์—์„œ ์œ ํšจํ•œ ๋ณ€์ˆ˜ ํ‚ค์›Œ๋“œ
โ€ข
์žฌํ• ๋‹น โญ•๏ธ
โ€ข
์žฌ์„ ์–ธ
let num = 1; num = 2; // error! // let num = 3;
JavaScript
๋ณต์‚ฌ

const

๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉฐ ๋ธ”๋ก ์Šค์ฝ”ํ”„์™€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์—์„œ ์œ ํšจํ•œ ๋ณ€์ˆ˜ ํ‚ค์›Œ๋“œ
์„ ์–ธ๊ณผ ๋™์‹œํ•ด ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ๋ฒ• ์—๋Ÿฌ ๋ฐœ์ƒ
๊ฐ’์˜ ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ const ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ์‹œ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
โ€ข
์žฌํ• ๋‹น
โ€ข
์žฌ์„ ์–ธ
const pi = 3.141592; // error! // pi = 5; // const pi = 0;
JavaScript
๋ณต์‚ฌ

var

์ „์—ญ ๊ฐ์ฒด window์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋งŒ ์œ ํšจํ•˜๋‹ค.
โ€ข
์žฌํ• ๋‹น โญ•๏ธ
โ€ข
์žฌ์„ ์–ธ โญ•๏ธ
var name = 'soyou'; name = 'soyeon'; var name = 'pongduk';
JavaScript
๋ณต์‚ฌ
๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Œ. ๊ฐ’์€ undefined๋ฅผ ๋ฐ˜ํ™˜
์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ window ๊ธฐ๋Šฅ์„ ๋ฎ์–ด์”Œ์›Œ์„œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค๊ธฐ๋„ ํ•จ.
โ‡’ var๋ณด๋‹ค๋Š” let ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ๊ถŒ์žฅ
์„ ์–ธ ์—†์ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ž‘๋™ํ•˜๋Š”๋ฐ ๊ตณ์ด ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์žˆ๋‚˜์š”? ์„ ์–ธ ์—†์ด ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋ฉด JS ์—”์ง„์€ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ window์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋™์  ์ƒ์„ฑํ•˜์—ฌ ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์•”๋ฌต์  ์ „์—ญ(implicit global)์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋ฟ์ด๋ฏ€๋กœ ํ˜ธ์ด์ŠคํŒ… ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ delete ์—ฐ์‚ฐ์ž๋กœ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ‘์—์„œ ์•Œ์•„๋ณผ ์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ์ ์ด ๋™์ผํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚œ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ๊ผญ ์„ ์–ธ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜์ž!

window ๊ฐ์ฒด

๋ธŒ๋ผ์šฐ์ €์—๋งŒ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฐฝ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ์ฒด์ง€๋งŒ ์ด์™€ ๋ณ„๊ฐœ๋กœ ์ „์—ญ ์˜์—ญ์„ ๋‹ด๊ณ  ์žˆ์Œ
var๋กœ ์„ ์–ธ๋œ ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐ ์ „์—ญ ํ•จ์ˆ˜๋Š” window ๊ฐ์ฒด์— ์†ํ•จ
ํ•จ์ˆ˜ ์„ ์–ธ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ var๋กœ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด window ๊ฐ์ฒด์—์„œ๋„ ๋™์ผํ•œ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด? ์•”๋ฌต์  ๊ฒฐํ•ฉ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜ค์—ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ์ˆ˜๋งŽ์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์™€ ๋กœ์ง์ด ํฌํ•จ๋œ๋‹ค. ๋งŒ์•ฝ ์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋กœ์ง์œผ๋กœ ์ธํ•ด ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” side effect๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด๋””์„œ๋“  ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ. ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ตœ์†Œํ™” ํ• ์ˆ˜๋ก side effect๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์ „์—ญ๋ณ€์ˆ˜ var ํ‚ค์›Œ๋“œ๋Š” ์˜๋„์น˜ ์•Š์€ ์žฌํ• ๋‹น์— ์˜ํ•œ ์ƒํƒœ๋ณ€ํ™”๋กœ ์ฝ”๋“œ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋ฏ€๋กœ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผํ•จ ๊ธด ์ƒ๋ช…์ฃผ๊ธฐ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ๋™์ผ. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ ์œ ํ•˜๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค. ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์—์„œ ์ข…์ ์— ์กด์žฌ ์ „์—ญ๋ณ€์ˆ˜์˜ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋Š๋ฆผ
๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ์ข์„์ˆ˜๋ก ์ข‹๋‹ค! ๋”ฐ๋ผ์„œ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™” ํ•ด์•ผํ•œ๋‹ค.

์ „์—ญ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์ตœ์†Œํ™”

์ „์—ญ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‘ ๊ฐ€์ง€ ์žˆ๋‹ค.

์ „์—ญ๋ณ€์ˆ˜ ๊ฐ์ฒด ์‚ฌ์šฉ

ํ•˜๋‚˜๋Š” ์ „์—ญ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
var MYAPP = {}; MYAPP.cat = { name: 'munji', gender: 'female' }; console.log(MYAPP.cat.name); // munji
JavaScript
๋ณต์‚ฌ

์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜ ์‚ฌ์šฉ

์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜(Immediately-Invoked Function Expression)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ ํ›„ ๋ฐ”๋กœ ์‚ฌ์šฉ๋˜์–ด ์ „์—ญ์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ๋œ๋‹ค.
(function () { var MYAPP = {}; MYAPP.cat = { name: 'munji', gender: 'female' }; console.log(MYAPP.cat.name); // munji }()); console.log(MYAPP.cat.name); // error
JavaScript
๋ณต์‚ฌ

๋ชจ๋“ˆ ํŒจํ„ด

ํด๋ž˜์Šค๋ฅผ ๋ชจ๋ฐฉํ•ด ๊ด€๋ จ์ด ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๋ชจ์•„ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์„ ๋งŒ๋“ฆ
โ†’ ํด๋กœ์ €

Strict Mode ์—„๊ฒฉ ๋ชจ๋“œ

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณด๋‹ค ์—„๊ฒฉํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ชจ๋“œ
์„ ์–ธ ์—†๋Š” ๋ณ€์ˆ˜ ํ• ๋‹น์˜ ๊ฒฝ์šฐ๋„ strict mode์—์„œ๋Š” ์—๋Ÿฌ๋กœ ํŒ๋‹จํ•ด์ฃผ์–ด ์‹ค์ˆ˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
'use strict';
HTML
๋ณต์‚ฌ

in Python (Writting)

LEGB Rule

ํŒŒ์ด์ฌ ๋ณ€์ˆ˜์˜ scope ๋ฃฐ์„ LEGB ๋ฃฐ์ด๋ผ๊ณ  ํ•จ.
ํŒŒ์ด์ฌ์€ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ์ฐพ์„ ๋•Œ,
Local > Enclosed > Global > Built-in์˜ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ’์„ ์ฐพ์Œ
โ€ข
local - ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ•จ์ˆ˜ ์•ˆ ๋ฒ”์œ„
โ€ข
Enclosed - ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ทธ ๋‹ค์Œ์œผ๋กœ ๊ฐ€๊นŒ์šด ํ•จ์ˆ˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€๋ฆฌํ‚ด
โ€ข
Global - ํ•จ์ˆ˜ ๋ฐ”๊นฅ์˜ ๋ณ€์ˆ˜๋‚˜ import๋œ Module
โ€ข
Built-in - ๊ฐ€์žฅ ๊ด‘๋ฒ”์œ„ํ•œ scope. ํŒŒ์ด์ฌ ์•ˆ์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ์†์„ฑ๋“ค๋กœ ๋”ฐ๋กœ ์„ ์–ธ์ด ์—†์–ด๋„ ๋ชจ๋“  ํŒŒ์ด์ฌ ํŒŒ์ผ์—์„œ ์œ ํšจํ•œ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
>>> a = 5 # Global >>> b = 10 # Global >>> def outer(): ... a = 10 # outerํ•จ์ˆ˜์˜ local์ด๋ฉฐ, innerํ•จ์ˆ˜์˜ Enclosed ... def inner(): ... c=30 # inner ํ•จ์ˆ˜์˜ local ... print(a, b, c) ... inner() ... a = 22 # outerํ•จ์ˆ˜์˜ local์ด๋ฉฐ, innerํ•จ์ˆ˜์˜ Enclosed ... inner() ... >>> outer() 10 10 30 22 10 30
Python
๋ณต์‚ฌ
โ€ข
locals() : ๋กœ์ปฌ ๋ณ€์ˆ˜ ํ™•์ธ
โ€ข
globals() : ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜ ํ™•์ธ
>> a = 1 >> def foo(): b = 3 >> foo() a in global(): True b in global(): False
Python
๋ณต์‚ฌ

Reference

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive, ์ด์›…๋ชจ, ์œ„ํ‚ค๋ถ์Šค - p.189 ~