๐ ์ผ๋จ Lexical Scope? Dynamic Scope?
โพ Lexical Scope
ํจ์๋ ๋ณ์์ ์ค์ฝํ๋ฅผ ์ ์ธ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํจ ( Compile ์์ )
โพ Dynamic Scope
ํจ์๋ ๋ณ์์ ์ค์ฝํ๋ฅผ ํธ์ถ๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ์ ํจ ( Runtime ์์ )
// 01 Lexical Scope์ Dynamic Scope ๋น๊ต
let x = 1;
function print() {
console.log(x); // Lexical Scope : 1 -> ์ ์ธ๋ ์์น ๊ธฐ์ค / ๋ณ์ x ์ ์ญ ์ค์ฝํ
}
function foo() {
let x = 100;
print(); // Dynamic Scope : 100 -> ํธ์ถ๋ ์์ ๊ธฐ์ค / ๋ณ์ x ์ง์ญ ์ค์ฝํ
}
foo();
// 02 ๋ด๋ถ ํจ์์ Scope Chain
let name = "kim";
function init() {
let name = "Lee"; // name์ init์ ์ํด ์์ฑ๋ ์ง์ญ ๋ณ์์ด๋ค.
function displayName() { // displayName()์ ๋ด๋ถ ํจ์์ด๋ฉฐ, ํด๋ก์ ๋ค.
alert(name); // ๋ถ๋ชจ ํจ์์์ ์ ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
}
displayName();
}
init(); // "Lee"
์๋ฐ์คํฌ๋ฆฝํธ๋ Lexical Scope๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์, ํจ์๋ ๋ณ์๊ฐ ์ ์ธ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ๊ฒน ํ ๊ฒน ์ค์ฝํ๋ฅผ ๋ฒ๊ฒจ ๋๊ฐ๋ฉด์ ๊ทธ ๋ด๋ถ์ ์ ์ธ๋ ๋ณ์๋ฅผ ์ฐพ๋๋ค.
์ ์์๋ก ๋ณด๋ฉด, ์์ ์ scope -> ์์ ์ ํฌํจํ๋ ์ธ๋ถ ํจ์ scope(์ฌ๊ธฐ์ init) -> ์ ์ญ scope ์์ผ๋ก ๋ณ์๋ฅผ ์ฐพ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ์ผ์นํ๋ ๋ณ์๋ฅผ ์ฐพ์ ๋๊น์ง ์ค์ฝํ๋ฅผ ๋ฒ๊ฒจ๋๊ฐ ์ ์๋ ์ด์ ๋ Scope Chain ๋๋ฌธ์ด๋ค.
๐ ํด๋ก์ ?
์์ ์ด ์์ฑ๋ ์์ ์ ํ๊ฒฝ์ ๊ธฐ์ตํ๋ ํจ์
--> ์ธ๋ถ ํจ์ ํธ์ถ์ด ์ข ๋ฃ๋์์์๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ ์ธ์์ ์ ๊ทผํ ์ ์๋ ํจ์ !!
// 03 ํด๋ก์ ์์
let x = 1;
function outer(z) {
let y = 2;
return function inner() {
console.log(x + y + z);
}
}
let sum = outer(3);
sum();
๋ณ์ sum์ outer(3)์ผ๋ก ์ธํด ๋ด๋ถ ํจ์( inner( ) )๋ฅผ ๋ฆฌํด๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ sum( )์ ์ํด ํด๋น ๋ด๋ถ ํจ์( inner( ) )๋ฅผ ํธ์ถํ๋ค. --> ์ต์ข ์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฐ์ 6 !!!
์? Why????
๋ณ์ sum์ด ํ ๋น๋ฐ์ ๊ฒ์ ๋ฆฌํด๋ ๋ด๋ถ ํจ์ inner( ) ๋ค.
์์์ ์ผ๋ก ๋ณด๋ฉด inner ํจ์ ๋ด๋ถ์๋ x, y๊ฐ ์ ์ธ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ NaN๊ฐ ๋์ฌ๊ฒ๋ง๊ฐ๋ค.
๊ทธ๋ฐ๋ฐ sum( )์ 6์ ๋ฐํํ๋ค. inner ํจ์๊ฐ (์ด๋ฏธ ์คํ์ด ์ข ๋ฃ๋) outer ํจ์์ ๋ณ์ y์ z์ ์ ๊ทผํ๋ค๋ ๊ฒ์ ๋ปํ๋ค !!
์ฆ์ฆ์ฆ์ฆ inner ํจ์๋ Scope Chain์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ outer ํจ์์ ๋ณ์ y, z๋ฅผ ์ฐธ์กฐํ ์ ์๋ค !!
์ ์์์ inner์ฒ๋ผ ์ธ๋ถ ํจ์๊ฐ ์ข ๋ฃ๋์์์๋ Scope Chain์ ์ด์ฉํด ์ธ๋ถ ํจ์์ ๋ณ์, ์ธ์์ ์ ๊ทผํ ์ ์๋ ํจ์๋ฅผ
Closure ํด๋ก์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๐ ํด๋ก์ ํ์ธ
๊ฐ์ด ์ ์ฅ๋๊ณ ์๋ ? ๋๋์ฒด ์ด๋์ ? ํ์ธํ๋ ๋ฐฉ๋ฒ
console.dir( ) ํ์ฉํ๊ธฐ
let x = 1;
function outer(y) {
let z = 3;
return function middle(m) {
let p = 5;
return function inner() {
console.log(x + y + z + m + p);
}
}
}
let middle = outer(2);
let inner = middle(4);
console.dir(inner);
// ๊ฒฐ๊ณผ
// middle ํจ์์ ๋ณ์์ ์ธ์๋ฅผ inner ํจ์๊ฐ ์ฌ์ฉํ์ง ์์์ ๋
let x = 1;
function outer(y) {
let z = 3;
return function middle(m) {
let p = 5;
return function inner() {
console.log(x + y + z);
}
}
}
let middle = outer(2);
let inner = middle(4);
console.dir(inner);
// ๊ฒฐ๊ณผ
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด inner ํจ์์ Scope Chain์์ middle์ ๋ํ ์ ๋ณด๋ ์๋ค.
์ฆ Scope Chain์ ๋ด๋ถ ํจ์๊ฐ ์ฌ์ฉํ๋ ์ ๋ณด์ ๋ํด์๋ง ์ ์งํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค ~!~!
'Front-end > JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค Class ์ ๋ฌธ (0) | 2021.08.29 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ ํด๋ก์ ํ์ฉ Closure private ๋ณ์, ๋ฉ์๋ ํ๋ด ๋ด๊ธฐ (0) | 2021.08.28 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๊ณ ์ฐจํจ์ forEach / map (0) | 2021.08.23 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๋ฉ์๋ Array Method (๊ณ์ ์ถ๊ฐ์ค) (0) | 2021.08.21 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๊ณ ์ฐจํจ์ reduce (0) | 2021.08.15 |
๋๊ธ