ํด๋ก์ โ
ํจ์์ ํจ์๊ฐ ์ ์ธ๋ ์ดํ์ ํ๊ฒฝ์ ์กฐํฉ
์ด ํ๊ฒฝ์ ํด๋ก์ ๊ฐ ์์ฑ๋ ์์ ์ ์ ํจ ๋ฒ์ ๋ด์ ์๋ ๋ชจ๋ ์ง์ญ ๋ณ์๋ก ๊ตฌ์ฑ๋๋ค.
์ฆ, ๋ด๋ถ ํจ์์์ ์ธ๋ถ ํจ์์ ์๋ ์ํ์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ค๋ ๊ฒ์ด๋ค.
์ ์ฌ์ฉํ ๊น โ
๋ด๋ถ ์ ๋ณด๋ฅผ ์๋ํ๊ณ , ๊ณต๊ฐ ํจ์(public ๋๋ ์ธ๋ถ)๋ฅผ ํตํ ๋ฐ์ดํฐ ์กฐ์์ ์ํด ์ฌ์ฉํ๋ค. (์บก์ํ, ์ ๋ณด์๋)
์ ์ญ๋ณ์ ๋ํ ์ค์ฌ์ง๊ฒ ๋๋ฏ๋ก ๊ฐ๋ฐ ๊ณผ์ ์์ ์ค์๋ก ์ ๊ทผํ๋ ์ผ์ด ์์๊ธด๋ค.
ํ์ฌ๋ ํด๋์ค์์์ private ํ๋ ๋๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ด๋ป๊ฒ ์ด๊ฒ์ด ๊ฐ๋ฅํ ๊น โ
inner ๋ ์์ปฌ ํ๊ฒฝ์ด ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋ก์ ๋ฅผ ์ ์ดํดํ๋ ค๋ฉด ์ด๋ป๊ฒ ๋ณ์์ ์ ํจ๋ฒ์๋ฅผ ์ง์ ํ๋์ง(Lexical scoping)๋ฅผ ๋จผ์ ์ดํดํด์ผ ํ๋ค.
๐์ฐธ๊ณ
์คํ ์ปจํ ์คํธ
- ์๋ณ์๊ฐ ์ ์ธ๋๋ ํ๊ฒฝ์ผ๋ก, ์ฝ๋์ ์คํ์์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ต
- ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํ์ฌ ์๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋ ์ ์ฅ์ ์ญํ
๋ ์์ปฌ ํ๊ฒฝ์ 3๊ฐ์ง์ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ
- ํ๊ฒฝ ๋ ์ฝ๋(Environment Record)
- ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ(Outer Lexical Environment Reference)
- this ๋ฐ์ธ๋ฉ(This binding)
๐ ์ดํ์ ๋ฒ์ ์ง์ (Lexical scoping)
function init() {
var name = 'SeongHo'; // name์ init์ ์ํด ์์ฑ๋ ์ง์ญ ๋ณ์์ด๋ค.
function displayName() {
// displayName() ์ ๋ด๋ถ ํจ์์ด๋ฉฐ, ํด๋ก์ ๋ค.
console.log(name); // ๋ถ๋ชจ ํจ์์์ ์ ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
}
displayName();
}
init();
// ์ถ๋ ฅ ๊ฒฐ๊ณผ: SeongHo
๋ค์๊ณผ ๊ฐ์ด displayName() ๋ด๋ถ์ ์์ ๋ง์ ์ง์ญ ๋ณ์๊ฐ ์์ง๋ง , ๋ถ๋ชจ ํจ์ init()์์ ์ ์ธ๋ ๋ณ์ name์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ๋ง์ฝ ์์ ๋ง์ name ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, name ๋์ ์ this.name์ ์ฌ์ฉํ์ ๊ฒ์ด๋ค.
๐ ์ฐธ๊ณ
lexical
์ดํ์ ๋ฒ์ ์ง์ (lexical scoping) ๊ณผ์ ์์ ๋ณ์๊ฐ ์ด๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์๊ธฐ ์ํด ๊ทธ ๋ณ์๊ฐ ์์ค์ฝ๋ ๋ด ์ด๋์์ ์ ์ธ๋์๋์ง ๊ณ ๋ คํ๋ค๋ ๊ฒ์ ์๋ฏธ
๐ ํด๋ก์ ์์ ์ฝ๋
์ค์ฒฉ๋ ํจ์๋ ์ธ๋ถ ๋ฒ์(scope)์์ ์ ์ธํ ๋ณ์์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
function selectName() {
const name = 'SeongHo';
function displayName() {
console.log(name);
}
return displayName;
}
// myName๋ณ์์ displayName์ ๋ฆฌํดํจ(์ฐธ์กฐ ๊ฐ ์ ๋ฌ)
// ์ ํจ๋ฒ์์ ์ดํ์ ํ๊ฒฝ์ ์ ์ง
const myName = selectName();
// ๋ฆฌํด๋ displayName ํจ์๋ฅผ ์คํ(name ๋ณ์์ ์ ๊ทผ)
myName();
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์๋ฅผ ๋ฆฌํดํ๊ณ , ๋ฆฌํดํ๋ ํจ์๊ฐ ํด๋ก์ ๋ฅผ ํ์ฑํ๋ฏ๋ก selectName() ํจ์์ ์คํ์ด ๋๋๋๋ผ๋ name ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
๐ class์์ private ํ๋๋ฅผ ์ฌ์ฉํ ์ฝ๋
class selectName {
#name = 'SeongHo';
displayName() {
console.log(this.#name);
}
}
const myName = new selectName();
myName.displayName();
๋ง๋ฌด๋ฆฌ..
์์ง ์ ๋ถ๋ฅผ ์ดํดํ๊ธฐ์๋ ์ด๋ ค์์ด ๋ง๋ค.. ํํ
ํด๋ก์ ๋ฅผ ์๋ฒฝํ๊ฒ ์ดํดํ๋ ค๋ฉด ์ค์ฝํ์ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํด์ ๋ ๊ณต๋ถ๊ฐ ํ์ํ๋ค..
ํ๋ํ๋์ฉ ์ง์์ ์ต๋ํ๋ฉด์ ๋ธ๋ก๊ทธ์ ํฌ์คํ ํ๋ค ๋ณด๋ฉด ๊ด์ฐฎ์ ๊ฐ๋ฐ์๊ฐ ๋์ง ์์๊นโโ
์ด ๊ธ์ ๋ณด๊ณ ์๋ชป๋ ๋ถ๋ถ์ ๋ํ ๋๊ธ์ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๐ ์ฐธ๊ณ ๋ฌธํ
https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures