๐ 13์ฅ, ์ค์ฝํ
1
๐ ๋ฐฐ์ด ๋ด์ฉ ๋ฐ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
์ค์ฝํ
์ค์ฝํ(scope): ์๋ณ์๊ฐ ์ ํจํ ๋ฒ์
์๋ณ์ ๊ฒฐ์ (identifier resolution): ์ด๋ฆ์ด ๊ฐ์ ๋ ๊ฐ์ ๋ณ์ ์ค์์ ์ด๋ค ๋ณ์๋ฅผ ์ฐธ์กฐํด์ผ ํ ๊ฒ์ธ๊ฐ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ
1 2 3 4 5 6 7 8 9 10
var x = 'global'; function foo() { var x = 'local'; console.log(x); // local } foo(); console.log(x); // global
์ฝ๋์ ๋ฌธ๋งฅ๊ณผ ํ๊ฒฝ
๋ ์์ปฌ ํ๊ฒฝ: ์ฝ๋๊ฐ ์ด๋์ ์คํ๋๋ฉฐ ์ฃผ๋ณ์ ์ด๋ค ์ฝ๋๊ฐ ์๋์ง
์ปจํ ์คํธ: ๋ ์์ปฌ ํ๊ฒฝ์์ ์ด๋ฃจ์ด์ง
๋ชจ๋ ์ฝ๋๋ ์คํ ์ปจํ ์คํธ์์ ํ๊ฐ๋๊ณ ์คํ๋๋ฉฐ ์ค์ฝํ๋ ์คํ ์ปจํ ์คํธ์ ๊น์ ๊ด๋ จ์ด ์์
- ๋ง์ฝ ์ค์ฝํ ๊ฐ๋ ์ด ์๋ค๋ฉด ๊ฐ์ ์ด๋ฆ์ ๊ฐ๋ ๋ณ์๋ ์ถฉ๋์ ์ผ์ผํด == ํ๋๋ง ์ฌ์ฉ๊ฐ๋ฅ
์ค์ฝํ์ ์ข ๋ฅ
- ์ ์ญ: ์ฝ๋ ๊ฐ์ฅ ๋ฐ๊นฅ ์์ญ
- ์ ์ญ ๋ณ์๋ ์ด๋์๋ ์ฐธ์กฐ๊ฐ๋ฅ
- ์ง์ญ: ํจ์ ๋ชธ์ฒด ๋ด๋ถ
์ง์ญ๊ณผ ์ง์ญ์ค์ฝํ
- ์ง์ญ ๋ณ์๋ ์์ ์ ์ง์ญ์ค์ฝํ์ ํ์ ์ง์ญ ์ค์ฝํ์์๋ง ์ ํจ
์ค์ฝํ ์ฒด์ธ
- ์ค์ฝํ๊ฐ ํจ์์ ์ค์ฒฉ์ ์ํด ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ์
- ์ค์ฝํ ์ฒด์ธ(scope chain): ์ค์ฝํ๊ฐ ๊ณ์ธต์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ
- ๋ณ์๋ฅผ ์ฐธ์กฐํ ๋ ์ค์ฝํ ์ฒด์ธ์ ํตํด ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ์ฝ๋์ ์ค์ฝํ์์ ์์ํ์ฌ ์์ ์ค์ฝํ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ์ฌ ์ ์ธ๋ ๋ณ์๋ฅผ ๊ฒ์ํจ
- ๋ฌผ๋ฆฌ์ ์ธ ์ค์ฒด๋ก ์กด์ฌ
- ๋ ์์ปฌ ํ๊ฒฝ์ ๋จ๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐํ ๊ฒ. ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฝ๋๊ฐ ๋ก๋๋๋ฉด ๊ณง๋ฐ๋ก ์์ฑ๋๊ณ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ ํจ์๊ฐ ํธ์ถ๋๋ฉด ๊ณง๋ฐ๋ก ์์ฑ๋จ
์ค์ฝํ ์ฒด์ธ์ ์ํ ๋ณ์ ๊ฒ์
- ์์ ์ค์ฝํ์์ ์ ํจํ ๋ณ์๋ ํ์ ์ค์ฝํ์์ ์์ ๋กญ๊ฒ ์ฐธ์กฐ ๊ฐ๋ฅ
- ํ์ ์ค์ฝํ์์ ์ ํจํ ๋ณ์๋ฅผ ์์ ์ค์ฝํ์์ ์ฐธ์กฐํ ์ ์์
- ์ค์ฝํ์ ๊ณ์ธต์ ๊ตฌ์กฐ๋ ์์๊ณผ ์ ์ฌํจ
ํจ์ ๋ ๋ฒจ ์ค์ฝํ
์ฝ๋ ๋ธ๋ก์ด ์๋ ํจ์์ ์ํด์๋ง ์ง์ญ์ค์ฝํ๊ฐ ์์ฑ
๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ(block level scope): ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ํจ์ ๋ชธ์ฒด๋ง์ด ์๋๋ผ ๋ชจ๋ ์ฝ๋ ๋ธ๋ก์ด ์ง์ญ์ค์ฝํ๋ฅผ ๋ง๋ฆ
varํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ค๋ก์ง ํจ์์ ์ฝ๋ ๋ธ๋ก๋ง์ ์ง์ญ์ค์ฝํ๋ก ์ธ์
1 2 3 4 5 6 7 8 9 10 11
var x = 1; if (true) { // var ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ํจ์์ ์ฝ๋ ๋ธ๋ก(ํจ์ ๋ชธ์ฒด)๋ง์ ์ง์ญ ์ค์ฝํ๋ก ์ธ์ ํ๋ค. // ํจ์ ๋ฐ์์ var ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ฝ๋ ๋ธ๋ก ๋ด์์ ์ ์ธ๋์๋ค ํ ์ง๋ผ๋ ๋ชจ๋ ์ ์ญ ๋ณ์๋ค. // ๋ฐ๋ผ์ x๋ ์ ์ญ ๋ณ์๋ค. ์ด๋ฏธ ์ ์ธ๋ ์ ์ญ ๋ณ์ x๊ฐ ์์ผ๋ฏ๋ก x ๋ณ์๋ ์ค๋ณต ์ ์ธ๋๋ค. // ์ด๋ ์๋์น ์๊ฒ ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๋ถ์์ฉ์ ๋ฐ์์ํจ๋ค. var x = 10; } console.log(x); // 10
1 2 3 4 5 6 7 8 9
var i = 10; // for ๋ฌธ์์ ์ ์ธํ i๋ ์ ์ญ ๋ณ์๋ค. ์ด๋ฏธ ์ ์ธ๋ ์ ์ญ ๋ณ์ i๊ฐ ์์ผ๋ฏ๋ก ์ค๋ณต ์ ์ธ๋๋ค. for (var i = 0; i < 5; i++) { console.log(i); // 0 1 2 3 4 } // ์๋์น ์๊ฒ ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค. console.log(i); // 5
๋ ์์ปฌ ์ค์ฝํ
1
2
3
4
5
6
7
8
9
10
11
12
13
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
bar ํจ์์ ์์ ์ค์ฝํ ๊ฒฐ์ ๋๊ฐ์ง ํจํด
- ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋์ง์ ๋ฐ๋ผ ํจ์์ ์์ ์ค์ฝํ ๊ฒฐ์
- ๋์ ์ค์ฝํ: ํจ์๊ฐ ํธ์ถ๋๋ ์์ ์ ๋์ ์ผ๋ก ์์์ค์ฝํ ๊ฒฐ์
ํจ์๋ฅผ ์ด๋์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ํจ์์ ์์ ์ค์ฝํ ๊ฒฐ์
๋ ์์ปฌ ๋๋ ์ ์ ์ค์ฝํ
- ์ ์ ์ค์ฝํ: ํจ์ ์ ์๊ฐ ํ๊ฐ๋๋ ์์ ์ ์์ ์ค์ฝํ๊ฐ ์ ์ ์ผ๋ก ๊ฒฐ์
- ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋กฏํ ๋๋ถ๋ถ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฆ
- ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋์ง์ ๋ฐ๋ผ ํจ์์ ์์ ์ค์ฝํ ๊ฒฐ์
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋ฏ๋ก ํจ์๊ฐ ์ด๋์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ ๊ฒฐ์
- ํจ์์ ์์ ์ค์ฝํ๋ ์ธ์ ๋ ์์ ์ด ์ ์๋ ์ค์ฝํ
ํจ์์ ์์ ์ค์ฝํ๋ ํจ์ ์ ์๊ฐ ์คํ๋ ๋ ์ ์ ์ผ๋ก ๊ฒฐ์
- ๋ฐ๋ผ์ ์์ foo()์ bar()๋ 1์ ์ถ๋ ฅ
1
โ๏ธ ์ฝ์ ์๊ฐ
์ค์ฝํ๋ ์๋ณ์๊ฐ ์ ํจํ ๋ฒ์๋ฅผ ์๋ฏธํ๋ค. ๋ํ ๋ ์์ปฌํ๊ฒฝ์ ์ฝ๋๊ฐ ์ด๋์ ์คํ๋๋ฉฐ ์ฃผ๋ณ์ ์ด๋ค ์ฝ๋๊ฐ ์๋์ง๋ฅผ ์๋ฏธํ๋ฉฐ var ํค์๋๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ์ด๊ธฐ ๋๋ฌธ์ ํจ์ ์ฝ๋ ๋ธ๋ก์์๋ง ์ง์ญ์ค์ฝํ๋ก ์กด์ฌํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํจ์๋ฅผ ์ด๋์ ์ ์๋ฅผ ํ๋์ง์ ๋ฐ๋ผ ์ ์ ์ผ๋ก ์์ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ์ ์์๋ค.
1
โ ๊ถ๊ธํ ๋ด์ฉ์ด๋ ์ ์ดํด๋์ง ์๋ ๋ด์ฉ
- ์์