-
๐์๋ฐ์คํฌ๋ฆฝํธ 3 | Lexical Environment, Scope Chain์๋ฐ์คํฌ๋ฆฝํธ 2021. 11. 15. 19:01
function a(){ let b = 10; function c(){ console.log(b); } c(); } a(); console.log(b);
์์ ์ฝ๋๊ฐ ์คํ๋ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋์๊ฐ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋จผ์ ์ ์ญ ์ค์ฝํ์ ์์นํ๊ณ ์๋ ๋ณ์ a๋ฅผ ๋ด๊ณ , ๋ณ์ a์๋ ์ ์๋์ด์๋ ํจ์๋ฅผ ํ ๋นํ๋ค.
2. ๊ทธ ๋ค์ a ํจ์๊ฐ ํธ์ถ๋๊ณ ์ ์ญ ์ปจํ ์คํธ์์ a๊ฐ ์คํ๋์ด let b = 10 ์ฝ๋๊ฐ ์คํ๋๋ค.
3. ์ด์ call stack memory์ aํจ์๊ฐ ์ ์ฅ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ณ์ b์ c๊ฐ callstack์ ์ ์ฅ๋๋ค(b : 10, c : function(){}).
4. ๋ค์ cํจ์๊ฐ ํธ์ถ๋๊ณ console.log(b)๋ฅผ ๋ง๋๋ค. ํ์ฌ ํ์ฑํ ์ํ์ธ c ์ปจํ ์คํธ์์ b๋ฅผ ๊ฒ์ํ๋ค.
5. ๋ณ์ b๋ c ์์ ์๊ธฐ ๋๋ฌธ์ c ์ปจํ ์คํธ์์ ๋ค์ a ์ปจํ ์คํธ๊ฐ ํ์ฑํ ๋๋ค.
6. b๊ฐ ํ๋ฉด์ ์ฐํ๊ฒ ๋๋ค.
7. a ํจ์์ ์คํ์ด ์ข ๋ฃ๋๋ค. a ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ ์ญ ์ปจํ ์คํธ๊ฐ ๋ค์ ํ์ฑํ๋๋ค.
8. console.log(b)๋ฅผ ์คํํ๊ณ ์ ์ญ ์ปจํ ์คํธ์ b๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฌ๋ค.
9. ์ ์ญ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋๊ณ ์ข ๋ฃ๋๋ค.
Lexical Environment
ํจ์ C๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
C function is lexically sitting inside A function.
ํจ์ A๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
A function is lexically sitting inside Global scope.
์ด ๋ ๋ฌธ์ฅ์ ์๋ฏธ๋ C๋ A์ lexical environment์ ์ ๊ทผํ ์ ์๊ณ , A๋ global lexical environment์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค.
Scope Chain
์์ ์ฝ๋์์ ๊ณ์ lexical environment๋ฅผ ์ฐพ์๊ฐ๋ฉฐ ๋ง์ง๋ง์ ์ ์ญ ์ปจํ ์คํธ์ lexical environment์ ์ ๊ทผํ์๋ค. ๊ทธ๋ฆฌ๊ณ C์์ ๋ฐ๋ก A๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์๋, ๋ฐ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ์์์ธ b๋ถํฐ ์ฐจ๋ก๋๋ก ์ ๊ทผํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค(๋ค๋ฅธ ์์๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ).
์ฆ, ์ด๋ ๊ฒ '์๋ณ์์ ์ ํจ๋ฒ์'๋ฅผ ์์์๋ถํฐ ๋ฐ๊นฅ์ผ๋ก ์ฐจ๋ก๋ก ๊ฒ์ํด๋๊ฐ๋ ๊ฒ์ ์ค์ฝํ ์ฒด์ธ์ด๋ผ ํ๋ค.
[์ฐธ๊ณ ์๋ฃ]
https://www.youtube.com/watch?v=uH-tVP8MUs8
'์๋ฐ์คํฌ๋ฆฝํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐์๋ฐ์คํฌ๋ฆฝํธ 2 | ์ค์ฝํ(scope), let vs var vs const (0) 2021.11.15 ๐์๋ฐ์คํฌ๋ฆฝํธ 1 | ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ (0) 2021.11.13 ๐ ๋๊ธฐ์ ๋น๋๊ธฐ | Promises, callbacks, async/await (0) 2020.08.10 ๐์๋ฐ์คํฌ๋ฆฝํธ 5 | this, 5๊ฐ์ง ๋ฐ์ธ๋ฉ ํจํด (0) 2020.07.21