๐ ์ค์ฝํ ์ฒด์ธ(scope chain)์ ๋ํด์ ์์๋ณด์.
scope
๋ ์๋ณ์์ ๋ํ ์ ํจ ๋ฒ์๋ฅผ ๋ํ๋ธ๋ค. ์ด๋ค ๊ฒฝ๊ณ A
์ ์ธ๋ถ์์ ์ ์ธํ ๋ณ์๋ A
์ ์ธ๋ถ๋ฟ ์๋๋ผ A
์ ๋ด๋ถ์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง, A
์ ๋ด๋ถ์์ ์ ์ธํ ๋ณ์๋ ์ค์ง A
์ ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ค. ์ด๋ฌํ ์๋ณ์์ ์ ํจ๋ฒ์
๋ฅผ ์์์๋ถํฐ ๋ฐ๊นฅ์ผ๋ก ์ฐจ๋ก๋ก ๊ฒ์ํด๋๊ฐ๋ ๊ฒ์ ์ค์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๋ outerEnvironmentReference
๋ ํ์ฌ ํธ์ถ๋ ํจ์๊ฐ ์ ์ธ๋ ๋น์์ L.E
๋ฅผ ์ฐธ์กฐํ๊ฒ๋๋๋ฐ, ์ค์ํ ์ ์ ๊ณผ๊ฑฐ ๋น์ ์ ์ธ๋ ์์
์ด๋ค.
๋ค์ ์ฝ๋์ foo()
์ bar()
์ ์ถ๋ ฅ๊ฐ์ 1๋ก ๋์ผํ๋ฐ, ๊ทธ ์ด์ ๋ function bar
๊ฐ ์ ์ธ๋ ์์ ์ x
๋ ์ ์ญ ๋ณ์์ธ x
๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋๋ค. ์ฆ, this
์ฒ๋ผ ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋์ง ์ํฅ์ ๋ฐ๋ ๊ฒ์ด ์๋๋ผ ํจ์๋ฅผ ์ด๋์์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ค. ํจ์๊ฐ ํธ์ถ๋ ์์น๋ ์์ ์ค์ฝํ ๊ฒฐ์ ์ ์ด๋ ํ ์ํฅ๋ ์ฃผ์ง ์๋๋ค. ์ฆ, ํจ์์ ์์ ์ค์ฝํ๋ ์ธ์ ๋ ์์ ์ด ์ ์๋ ์ค์ฝํ๋ค. ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์๋ bar
ํจ์๋ ์ ์ญ์์ ์ ์๋ ํจ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์ญ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ๋จผ์ ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด๋ ์์ฑ๋ bar
ํจ์ ๊ฐ์ฒด๋ ์ ์ญ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๋ค. ๊ทธ๋ฆฌ๊ณ bar
ํจ์๊ฐ ํธ์ถ๋๋ฉด ํธ์ถ๋ ๊ณณ์ด ์ด๋์ธ์ง ๊ด๊ณ์์ด ์ธ์ ๋ ์์ ์ด ๊ธฐ์ตํ๊ณ ์๋ ์ ์ญ ์ค์ฝํ๋ฅผ ์์ ์ค์ฝํ๋ก ์ฌ์ฉํ๋ค.
var x = 1;
function foo(){
var x = 10;
bar();
}
function bar(){
console.log(x);
}
foo(); // 1
bar(); // 1
reference
๋๊ธ