ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ๋ ์์ปฌ ํ๊ฒฝ๊ณผ์ ์กฐํฉ์ด๋ค.
๐ฐ ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์์ ๋ฅผ ๋ด ๋ด
์๋ค.
const x = 1;
function outerFunc() {
const x = 10;
function innerFunc(){
console.log(x); // 10
}
innerFunc();
}
outerFunc();
์ด ๊ฐ์ ํ์์ด ๋ฐ์ํ๋ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ด๋ค
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋์ง๊ฐ ์๋๋ผ ํจ์๋ฅผ ์ด๋์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ค. ์ด๋ฅผ ๋ ์์ปฌ ์ค์ฝํ(์ ์ ์ค์ฝํ)๋ผ ํ๋ค.
ํจ์๋ ์์ ์ด ํธ์ถ๋๋ ํ๊ฒฝ๊ณผ๋ ์๊ด์์ด ์์ ์ด ์ ์๋ ํ๊ฒฝ, ์ฆ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ํจ์๋ ์์ ์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]์ ์์ ์ด ์ ์๋ ํ๊ฒฝ, ์์ ์ค์ฝํ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ค.
ํจ์ ๊ฐ์ฒด์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]์ ์ ์ฅ๋ ํ์ฌ ์คํ ์ค์ธ ์คํ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐ๊ฐ ๋ฐ๋ก ์์ ์ค์ฝํ๋ค. ๋ํ ์์ ์ด ํธ์ถ๋์์ ๋ ์์ค๋ ํจ์ ๋ ์์ปฌ ํ๊ฒฝ์ "์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ"์ ์ ์ฅ๋ ์ฐธ์กฐ๊ฐ์ด๋ค. ํจ์ ๊ฐ์ฒด๋ ๋ด๋ถ ์ฌ๋กฏ [[Environment]์ ์ ์ฅํ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐ, ์ฆ ์์ ์ค์ฝํ๋ฅผ ์์ ์ด ์กด์ฌํ๋ ํ ๊ธฐ์ตํ๋ค.
const x = 1;
// 1
function outer() {
const x = 10;
const inner = function() {console.log(x);}; //2
return inner;
}
// outer ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ค์ฒฉ ํจ์ inner๋ฅผ ๋ฐํํ๋ค.
// ๊ทธ๋ฆฌ๊ณ outer ํจ์์ ์คํ ์ปจํ
์คํธ๋ ์คํ ์ปจํ
์คํธ ์คํ์์ ํ๋์ด ์ ๊ฑฐ๋๋ค.
const innerFunc = outer()' // 3
innerFunc(); // 4 10
์ธ๋ถ ํจ์๋ณด๋ค ์ค์ฒฉ ํจ์๊ฐ ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ ์ค์ฒฉ ํจ์๋ ์ด๋ฏธ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ข ๋ฃํ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ์ด๋ฌํ ์ค์ฒฉ ํจ์๋ฅผ ํด๋ก์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํด๋ก์ ๋ ์ค์ฒฉ ํจ์๊ฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ณ ์ค์ฒฉ ํจ์๊ฐ ์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ์ ํ์ ํ๋๊ฒ์ด ์ผ๋ฐ์ .
ํด๋ก์ ๋ ์ํ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ ๋ค์ ๋งํด ์ํ๋ฅผ ์์ ํ๊ฒ ์๋ํ๊ณ ํน์ ํจ์์๊ฒ๋ง ์ํ ๋ณ๊ฒฝ์ ํ์ฉ
const increase = (function () {
// ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
// ํด๋ก์ ์ธ ๋ฉ์๋๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
// ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ค์ฝํ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
// ๋ฐ๋ผ์ ์๋ ๋ฉ์๋๋ค์ ์์ ์ค์ฝํ๋ ์ฆ์ ์คํ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ด๋ค
return{
// num:0, // ํ๋กํผํฐ๋ publicํ๋ฏ๋ก ์๋๋์ง ์๋๋ค.
increase() {
return ++num;
},
// ์นด์ดํธ ์ํ๋ฅผ 1๋งํผ ๊ฐ์์ํจ๋ค
decrease() {
return num > 0 ? --num : 0;
}
};
}());
console.log(increase()); // 1
console.log(increase()); // 2
console.log(decrease()); // 1
console.log(decrease()); // 0
ํด๋ก์ ๋ ์ํ๊ฐ ์๋์น ์๊ฒ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์์ ํ๊ฒ ์๋ํ๊ณ ํน์ ํจ์์๊ฒ๋ง ์ํ ๋ณ๊ฒฝ์ ํ์ฉํ์ฌ ์ํ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ
๋ณ์ ๊ฐ์ ๋๊ตฐ๊ฐ์ ์ํด ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์์ด ์ค๋ฅ ๋ฐ์์ ๊ทผ๋ณธ์ ์์ธ์ด๋๋ค. ์ธ๋ถ ์ํ ๋ณ๊ฒฝ์ด๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ํผํ๊ณ ๋ถ๋ณ์
ฉ์ ์งํฅํ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ๋ถ์ ํจ๊ณผ๋ฅผ ์ต๋ํ ์ต์ ํ์ฌ ์ค๋ฅ๋ฅผ ํผํ๊ณ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํด๋ก์ ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์
์บก์ํ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์กฐ์ํ ์ ์๋ ๋์์ธ ๋ฉ์๋๋ฅผ ํ๋๋ก ๋ฌถ๋ ๊ฒ
์บก์ํ๋ ๊ฐ์ฒด์ ํน์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ถ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ๋ ํ๋๋ฐ ์ด๋ฅผ ์ ๋ณด ์๋์ด๋ผ ํ๋ค.
โ ์์ฃผ ๋ฐ์ํ ์ ์๋ ์ค์๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ฌ
var funcs = [];
for (var i = 0; i < 3; i++){
funcs[i] = function () { return i; }; // 1
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]()); // 2
for๋ฌธ์ ๋ณ์ ์ ์ธ๋ฌธ์์ var ํค์๋๋ก ์ ์ธํ i ๋ณ์๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๊ฐ ์๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๊ฐ๊ธฐ๋๋ฌธ์ ์ ์ญ ๋ณ์๋ค. ์ ์ญ ๋ณ์ i์๋ 0,1,2๊ฐ ์์ฐจ์ ์ผ๋ก ํ ๋น๋๋ค. ๋ฐ๋ผ์ funcs ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐํ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ ์ญ ๋ณ์ i๋ฅผ ์ฐธ์กฐํ์ฌ i์ ๊ฐ 3์ด ๋์จ๋ค.
โญ๏ธ ์๋์ฒ๋ผ ๊ณ ์ณ๋ณด์
var funcs = [];
for (var i = 0; i < 3; i++){
funcs[i] (function (id) { // 1
return function () {
return id;
};
}(i));
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]());
}
๐
๋ง์น๋ฉฐ,,,,,,,,
ํด๋ก์ ๊ฐ ๋ฌด์์ด๊ณ ์ ์ฐ๋์ง๋ ์ ํํ ์๊ฒ ์ง๋ง, ์ฌ์ฉํ๋ ค๋ฉด ๋ ๋ฐฐ์ฐ๊ณ ์ต์ํด์ ธ์ผ ํ ๊ฒ ๊ฐ๋ค.