ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋์ ๋์ ๋ ์์ปฌ ํ๊ฒฝ(Lexical Scope)๊ณผ์ ์กฐํฉ
๊ฐ๋
- ํจ์๊ฐ ์์ ์ด ์ ์ธ๋ ํ๊ฒฝ์ ๊ธฐ์ตํ์ฌ ํจ์๊ฐ ํ๊ฒฝ ๋ฐ์์ ์คํ๋ ๋์๋ ํด๋น ํ๊ฒฝ์ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฆ, ๋ด๋ถ ํจ์์์ ์ธ๋ถ ํจ์์ ๋ฒ์์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค.
- ๋ํ, ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋ ์ธ๋ถ ํจ์์ ๋ณ์์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค.
function outerFunc() {
// ์ธ๋ถ ํจ์์ ๋ณ์
var name = "yundogi";
// ๋ด๋ถ ํจ์
var innerFunc = function () {
// ์ธ๋ถ ํจ์์ ๋ณ์์ ์ ๊ทผ
console.log(name); // "yundogi"
};
return innerFunc;
}
var inner = outerFunc(); // outerFunc()์ ์๋ช
์ฃผ๊ธฐ ๋
inner(); // "yundogi"
์ด๋์ ์ฌ์ฉํ ๊น?
ํด๋ก์ ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋์ ์ฌ์ฉ์์ ์์ก์ ๊ด๋ฆฌํ๋ ๊ฐ๋จํ ์ํ ๊ณ์ข ์๋ฎฌ๋ ์ดํฐ๋ฅผ ํตํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
const createAccount = (initial) => {
let balance = initial;
return {
deposit: amount => {
balance += amount;
return balance;
},
withdraw: amount => {
if (amount <= balance) {
balance -= amount;
return balance;
}
return "์์ก ๋ถ์กฑ";
},
getBalance: () => balance
};
};
const account = createAccount(1000);
console.log(account.getBalance()); // 1000
console.log(account.deposit(500)); // 1500
console.log(account.withdraw(200)); // 1300
console.log(account.withdraw(2000)); // "์์ก ๋ถ์กฑ"
1. ์๋ํ (like private
)
balance
๋ณ์๋ ํด๋ก์ ๋ฅผ ํตํด ์๋๋์ด ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค.- ์ธ๋ถ์์๋ ์ค์ง ๋ฐํ๋ ๊ฐ์ฒด์ ๋ฉ์๋(
deposit
,withdraw
,getBalance
)๋ฅผ ํตํด์๋งbalance
์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ๊ฑฐ๋ ์กฐ์ํ ์ ์์ต๋๋ค.
2. ์ํ ์ ์ง
account
์ ๊ฐ์ ๊ณ์ข ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๋, ์ด ๊ฐ์ฒด์ ๋ฉ์๋๋ค์ ๊ณ์ํด์balance
๋ณ์์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค.balance
๋ณ์๋ ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ ์ ์์ง๋ง, ํด๋ก์ ๋๋ถ์ ๊ณ์ข ๊ฐ์ฒด์ ๋ฉ์๋๋ค์ ํตํด ์ง์์ ์ผ๋ก ์ํ๋ฅผ ์ ์งํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ํด๋ก์ ์ ๊ธฐ๋ฅ ๋๋ถ์ ์๋์น ์๊ฒ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ํ์ด ์๋ ์ ์ญ ๋ณ์์ ์ฌ์ฉ์ ์ต์ ํ ์ ์์ต๋๋ค.
ํด๋ก์ ๋ฅผ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์ต๋๋ค: 0 ~ 4๊น์ง์ ์ซ์๋ฅผ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ์ถ๋ ฅํ๊ณ ์ ํฉ๋๋ค.
function counting() {
let count = 0;
for (count = 0; count < 5; count++) {
setTimeout(function() {
console.log(count);
}, count * 1000);
}
}
counting(); // 5 5 5 5 5
count
๊ฐ ๋ฃจํ ์ธ๋ถ์์ ์ ์ธ๋๊ณ ๊ฐ ๋ฐ๋ณต์์ ์ฌํ ๋น๋ฉ๋๋ค.- ๋ชจ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ๋์ผํ
count
๋ณ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. - ๋ฃจํ๊ฐ ๋๋๋ฉด
count
๋ 5๊ฐ ๋ฉ๋๋ค. - ์ด๋ก ์ธํด, ๋ชจ๋ ํ์ด๋จธ๋ ๊ฐ์
count
(๊ฐ์ด 5์ธ)๋ฅผ ์ฐธ์กฐํ์ฌ ์ถ๋ ฅํฉ๋๋ค.
ํด๋ก์ ๋ฅผ ํ์ฉํ์ฌ ์๋ ์๋๋๋ก ์ฝ๋๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
function counting() {
for (let count = 0; count < 5; count++) {
setTimeout(function() {
console.log(count);
}, count * 1000);
}
}
counting(); // 0 1 2 3 4
count
๊ฐ for ๋ฃจํ ๋ด์์ ์ ์ธ๋ฉ๋๋ค. ์ด๋ ๋ฃจํ์ ๊ฐ ๋ฐ๋ณต๋ง๋ค ์๋ก์ดcount
๋ณ์๋ฅผ ์์ฑํฉ๋๋ค.
(var
๋ก ์ ์ธํ ๊ฒฝ์ฐ, ํธ์ด์คํ ๋์ด ์์ ์ฝ๋์ ๋์ผํ๊ฒ ๋์ํ๊ฒ ๋ฉ๋๋ค.)setTimeout
์ ์ํด ์์ฑ๋ ๊ฐ ์ฝ๋ฐฑ ํจ์๊ฐ ๊ฐ ๋ฐ๋ณต๋ง๋ค ์๋ก ์์ฑ๋count
๋ฅผ ๊ธฐ์ตํฉ๋๋ค.- ๋ฃจํ๊ฐ ๋๋ ํ, 5๊ฐ์ ํ์ด๋จธ๋ ๊ฐ๊ฐ 0, 1, 2, 3, 4๋ฅผ ๊ธฐ์ตํ๊ณ ์์ต๋๋ค.
- ์ด๋ก ์ธํด, ๊ฐ๊ฐ์ ํ์ด๋จธ๋ ๊ฐ์ ๊ธฐ์ตํ๊ณ ์๋
count
( 0, 1, 2, 3, 4 )๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์์ ๋ฌธ์ ๋ฅผ IIFE(์ฆ์ ์คํ ํจ์)๋ก๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
function counting() {
let count = 0;
for (count = 0; count < 5; count++) {
(function (number) {
setTimeout(function() {
console.log(number);
}, number * 1000);
})(count);
}
}
counting(); // 0 1 2 3 4
Reference
JavaScript์ ํด๋ก์ (Closure)๋? (feat. React์ useState)
'๐ฅ Develop > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript] ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด ์ ๋ ฌํ๊ธฐ (0) | 2024.07.29 |
---|---|
[Javascript] Object.entries() ๋ฉ์๋ (0) | 2024.07.27 |
[Javascript] ์คํ๋ ๋(Spread) ์ฐ์ฐ์ (0) | 2024.07.26 |
[Javascript] ๋ฐ์ดํฐ ํ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ฐฉ์ (1) | 2024.07.24 |
[Javascript] ํธ์ด์คํ (Hoisting) (0) | 2024.07.19 |