๐ฑโ๐ Scope
JavaScript์์ scope์ด๋, JavaScript์ ๋ฌธ๋ฒ์ด ์๋๊ณ '๋ณ์๊ฐ ์ด๋๊น์ง ์ฐ์ผ ์ ์๋์ง'์ ๋ฒ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ค ๋ณ์๋ ์ฌ๊ธฐ์ ๊ธฐ์ ์ธ ์ ์๋ ๋ฐ๋ฉด์, ์ด๋ค ๋ณ์๋ ํน์ ํจ์ ๋ด์์๋ง ์ธ ์ ์์์ต๋๋ค.
์ด๋ฐ ๊ฐ๋ ์ด ๋ฐ๋ก scope์ ๋๋ค.
block
์ด๋์ค๊ดํธ({}, curly brace)
๋ก ๊ฐ์ธ์ง ๊ฒ์block
์ด๋ผ๊ณ ํฉ๋๋ค.
function์ ๋ด๋ถ๋ ํ๋์ block์ ๋๋ค.function hi() { return 'i am block'; //{}๋ก ๊ฐ์ธ์ง ํจ์์ ๋ด๋ถ! }
for๋ฌธ๋ ํ๋์ block์ด๊ณ ์
for (let i = 0; i < 10; i++) { count++; //{}๊ฐ์ธ์ง for๋ฌธ์ ๋ด๋ถ! }
if๋ฌธ์ {}๋ ํ๋์ block์ ๋๋ค.
if (i === 1) { let j = 'one'; //{}๊ฐ์ธ์ง if๋ฌธ์ ๋ด๋ถ! console.log(j); }
๐ {}(block)๋ด๋ถ์์ ๋ณ์๊ฐ ์ ์๋๋ฉด ๋ณ์๋ ์ค๋ก์ง {}(block)๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
{}(block)๋ด๋ถ์์ ์ ์๋ ๋ณ์๋local(์ง์ญ)๋ณ์
๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.์๋์ ์ฝ๋๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ์ธํด๋ด ์๋น
function getResult() { let result = 10; return result; } // ์๋ฐ์คํฌ๋ฆฝํธ ์๋ฌ! // getResult ๋ด๋ถ์ scope์ ์ ๊ทผํ ์ ์๋ค console.log(result);
console.log(result)์์ getResult ๋ด๋ถ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ result๋ผ๋ ๋ณ์๊ฐ ์กด์ฌํ๋์ง ์์ง ๋ชปํฉ๋๋ค.
result ๋ผ๋ ๋ณ์๋ getResultํจ์์ {}(block) ๋ด๋ถ์์ ์ ์ธ์ด ๋์๊ธฐ ๋๋ฌธ์, result ๋ณ์๋ getResultํจ์ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ฑโ๐ Global(์ ์ญ) Scope
scope์ ๋ณ์๊ฐ ์ ์ธ๋๊ณ ์ฌ์ฉํ ์ ์๋ ๊ณต๊ฐ์ ๋๋ค.
scope ์ธ๋ถ(block๋ฐ)์์๋ ํน์ scope์ ๋ณ์์ ์ ๊ทผํ ์๊ฐ ์์ต๋๋ค.
block๋ฐ์ธ global scope์์ ๋ง๋ ๋ณ์๋ฅผ global variable(์ ์ญ๋ณ์)๋ผ๊ณ ํฉ๋๋ค.const color = 'red'; console.log(color); function returnColor() { console.log(color); return color; } console.log(returnColor());
returnColor ๋ผ๋ ํจ์ ๋ด์์, returnColor ํจ์ ๋ฐ์ ์๋ color๋ผ๋ ๋ณ์๋ฅผ returnํด์ฃผ์์ต๋๋ค.
color๋ผ๋ ๋ณ์๋ global ๋ณ์์ด๊ธฐ ๋๋ฌธ์ returnColorํจ์์ block์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ 'red'๋ฅผ ๋ฐํํ๊ฒ์ ๋๋ค.
๋ค์ ๋งํ๋ฉด,color
๋ผ๋ ๋ณ์๋ ์ด๋ฏธreturnColor
ํจ์ ๋ฐ์์const color
๋ก ๋ณ์๊ฐ ์ง์ ์ด ๋๊ธฐ ๋๋ฌธ์returnColor
ํจ์ ๋ด๋ถ์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
๐ฑโ๐ Scope์ ์ค์ผ
์์์ ์ค๋ช ํ global ๋ณ์๋ฅผ ์ ์ธํ๋ฉด, ํด๋นํ๋ก๊ทธ๋จ์ ์ด๋์์๋ ์ฌ์ฉํ ์ ์๋ global namespace๋ฅผ ๊ฐ์ต๋๋ค.namespace
๋ผ๋ ๊ฒ์ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์๋ ๋ฒ์๋ผ๋ ๋ป์ ๋๋ค. scope์ด๋ผ๊ณ ๋ ํ๊ณ ํนํ ๋ณ์์ด๋ฆ์ ์๊ธฐํ ๋๋ namespace๋ผ๊ณ ๋ ํฉ๋๋ค.
global ๋ณ์๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ๊ณ์ ์ด์์์ต๋๋ค. ์ด ๋ง์ local ๋ณ์๋ {} - block์ด ๋๋๋ฉด ๋ ์ด์ ๋ณ์๊ฐ ์ด์์์ง ์๊ณ ์ธ ์ ์๋ค๋ ๋ง์ ๋๋ค.
global ๋ณ์๊ฐ ๊ณ์ ์ด์์์ด์ ๋ณ์๊ฐ์ด ๊ณ์ ๋ณํ๋ค๋ฉด ํด๋น ๋ณ์๋ฅผ ํธ๋ํนํ๊ธฐ๋ ์ด๋ ต๊ณ ์ด ๋ณ์๋ ์ด๋์์ ์ ํ์ํ์ง ์๋ ค๋ฉด ๋๋์ฒด ์ด๋์์ let, const๋ก ์ ์ธ์ ํ๋์ง ์ฐพ์ ๋์์ผ ํฉ๋๋ค.
์๋๋ scope์ด ์ค์ผ๋ ๋ํ์ ์ธ ์์ ๋๋ค.const satellite = 'The Moon'; const galaxy = 'The Milky Way'; let stars = 'North Star'; const callMyNightSky = () => { stars = 'Sirius'; return 'Night Sky: ' + satellite + ', ' + stars + ', ' + galaxy; }; console.log(callMyNightSky()); console.log(stars);
- stars์ด๋ผ๋ global ๋ณ์๊ฐ ์์ต๋๋ค.
- callMyNightSkyํจ์์์ ์๋ก์ด ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ถ์๋๋ฐ ๊น๋นกํ๊ณ let ํค์๋๋ฅผ ์์ฑํ์ง ์์์ต๋๋ค.
- callMyNightSky์ ํธ์ถํ๋ฉด stars ๋ณ์์ "Sirius"์ด ํ ๋น๋ฉ๋๋ค.
- global ๋ณ์์๋ stars์ ์ํฅ์ด ๊ฐ์ต๋๋ค!
- ๋ค๋ฅธ ํจ์์์ global ๋ณ์์ธ stars์ ์ฌ์ฉํ๊ณ ์ถ์๋ฐ ๊ฐ์ด ์์ ๋ "Sirius"์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์์ผ๋ก ํจ์๊ฐ ๋ช ์ญ๊ฐ ์์์ง๋ ๋ชจ๋ฅด๋ ์ํฉ์์ ์ ๋ ๊ฒ global ๋ณ์๋ฅผ ๋จ์ฉํ๋ค๊ฐ๋ ์ด๋์ ์ด๋ป๊ฒ ๊ฐ์ด ์์ ๋ ์ง ์ ์ ์์ด์ง๋๋ค.
๐ฑโ๐ ์ข์ Scoping ์ต๊ด
์์ ๊ฐ์ด global ๋ณ์๊ฐ ์ฌ๊ธฐ์ ๊ธฐ์ ์์ ๋๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ๋ณ์๋ค์ block scope์ผ๋ก ์ต๋ํ ๋๋ ๋์ผ ํฉ๋๋ค.
ํ์ดํธํ ๐scope(tightly scoping)์ ๋ณ์๋ ์ฝ๋ ํ์ง์ ์ฌ๋ ค์ค๋๋ค!!
- ์ฝ๋๊ฐ block์ผ๋ก ๋ช ํํ๊ฒ ๊ตฌ๋ถ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ์ฌ๋ผ๊ฐ๋๋ค.
- ์ฝ๋๊ฐ ํ์คํ์ค ์ญ ๋์ด๋ ๊ฒ์ด ์๋๋ผ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ๋ณ๋ก block์ ๋๋๋ฉด ์ฝ๋๊ฐ ์ดํดํ๊ธฐ ์ฌ์์ง๋๋ค.
- ๋์ค์ ์ฝ๋๋ฅผ ์์ ํ ์ผ์ด ์์ ๋, ์ฝ๋๋ฅผ ์ค๋๋ง์ ๋ณด๋๋ผ๋ ์ ๋๋์ด ์์ด์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ๋๋ ๋๊น์ง ๋ณ์๊ฐ ์ด์์๋ ๊ฒ์ด ์๋๋ผ์(block์ด ๋๋๋ฉด local ๋ณ์์ ์ถ์ด ๋๋์) ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ๋ ๋ฉ๋๋ค.
์ฆ, ํ๋ง๋๋ก ์์ฝํ๋ฉด ๐global ๋ณ์๋ ์ฐ์ง ์๋๋ก ๋ ธ๋ ฅํด์ผ ํ๊ณ , ์ต๋ํ {}๋ด์์ let, const์ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์๋ก ๋ง๋ค์ด์ ์ฐ์๋ ๋ง์ ๋๋ค.
์ด๋ฒ์๋ if๋ฌธ์ {}์ block scope์ ๋ณด๊ฒ ์ต๋๋ค.function logSkyColor() { const dusk = true; let myColor = 'blue'; if (dusk) { let myColor = 'pink'; console.log(myColor); // pink } console.log(myColor); // blue } console.log(myColor); // ์๋ฌ!!
- if๋ฌธ์ {}์ ์ฝ๋ block์ ์ฌ์ฉํ์์ต๋๋ค. ์ฌ๊ธฐ์ myColor๋ผ๋ ๋ณ์๋ฅผ let์ผ๋ก ์ ์ธํ์์ต๋๋ค.
- if๋ฌธ๋ด์์๋ "pink"๋ผ๊ณ ํ ๋นํ์๊ณ , if๋ฌธ ๋ฐ์์๋ "blue"๋ผ๊ณ ํ ๋นํ ๊ฒ์ ์ฃผ๋ชฉํด์ฃผ์ธ์.
- ์ฌ์ค ์ด ์ฝ๋๋ function์ block scope, if๋ฌธ์ block scope์ผ๋ก ๋ชจ๋ block ์ ์ ์ฌ์ฉํ์๋๋ฐ๋ scope namespace๊ฐ ์ค์ผ๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ ๊ฒ ๐์๋ก์ด block์์ ๋ณ์๋ฅผ ์ธ ๋๋ ํญ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํด์ผํ๋ค๋ ๊ฒ์ ์์ง ๋ง์์ฃผ์ธ์.