์๊ฐ..
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ ์์ปฌ ์ค์ฝํ ํ๊ฒฝ์ ๋ฐ๋ฅธ๋ค๋๊ฑด ์๊ณ ์๊ณ
๋ ์์ปฌ ์ค์ฝํํ๊ฒฝ ์ฆ, ์ ์ ์ค์ฝํ๋ ํจ์์ ํธ์ถ์ด์๋ ์ ์ธ์ ์ํด์ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๋ค
๋ ์์ปฌ์ค์ฝํ๋ฅผ ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฌ์ด ์์ ์ฝ๋๋ ์๋์ด๋ค.
๋ ์์ปฌ ์ค์ฝํ( ๋์ ์ค์ฝํ )
var x = "global";
function outer() {
var x = "local";
inner();
}
function inner() {
console.log(x);
}
outer() //global
inner() //global
์๋์ ๊ฐ์ด ๋ ์์ปฌ ์ค์ฝํ๋ ๋ด๋ถ ํจ์์์ ์ฐพ์ ์ ์๋ ๋ณ์์ด๋ฉด ์๋จ์ ์ธ๋ถํจ์๋ก ์ฌ๋ผ๊ฐ ์ฐพ๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ์ต์ข ์ ์ผ๋ก ์ ์ญ๋ณ์ ๋ฒ์๊น์ง ์ฌ๋ผ๊ฐ์๋ ์ฐพ์ ์ ์์ผ๋ฉด ์๋ฌ๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด๋ค.
๋์ ์ค์ฝํ
var x = "global";
function outer() {
var x = "local";
inner();
}
function inner() {
console.log(x);
}
outer() //local
inner() //global
๋์ ์ค์ฝํ๋ ๋ ์์ปฌ ์ค์ฝํ์ ๋ค๋ฅด๊ฒ ํจ์์ ํธ์ถ์ ๋ฐ๋ผ ๋ฒ์๋ฅผ ์ ํ๊ธฐ ๋๋ฌธ์ outer()ํจ์์์์ ํธ์ถ๋ inner()๋
inner()ํจ์์์๋ x๊ฐ ์๊ธฐ์ ํธ์ถ๋ ์๋ฆฌ์์ ํ๋ฒ ์ฌ๋ผ๊ฐ์ var x = "local"์ ๋ง๋ x๋ณ์๋ฅผ ์ฐพ๊ฒ๋๋ฉฐ
local์ ์ถ๋ ฅํ๊ฒ ๋๋๊ฑฐ๋ค.
๊ทธ๋์
ํด๋ก์ ํจ์๋ฅผ ์ดํดํ ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ์ํด ํจ์์์ ํจ์๊ฐ ์ ์ธ๋์ด ์๋ ๊ฒฝ์ฐ
ํด๋ก์
์ด๋ฏธ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ํจ์
function outerFunc() {
var x = 10;
var innerFunc = function () {console.log(x);}
return innerFunc();
}
var inner = outerFunc();
inner();
- ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
- ๋ณ์๊ฐ์ฒด์ inner, outerFunc๊ฐ ์์ฑ๋๊ณ , scope๋ ์ ์ญ๊ฐ์ฒด๊ฐ ๋๋ค.
- inner() - outerFunc()๊ฐ ์คํ๋จ์ ๋ฐ๋ผ, outerFunc()์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
- outerFunc() ์์ ๋ณ์ x, innerFunc๊ฐ ์์ฑ๋๊ณ , scope๋ outerFunc ๋ณ์๊ฐ์ฒด๊ฐ ๋๋ค.
- outerFunc()๊ฐ innerFunc๋ฅผ ์คํํ๋ฉฐ ๋ฆฌํดํ๋ค.
- innerFunc() ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
- innerFunc()์ scope๋ innerFunc์์ ๋ณ์๊ฐ์ฒด๊ฐ ์์์ ๋ฐ๋ผ, outerFunc์ ๋ณ์๋ฅผ ๊ฐ๋ฅดํจ๋ค.
- ์ด์๋ฐ๋ผ, innerFunc()์ scope๋ outerFunc()๊ฐ ๋๋ค.
outerFunc() ํจ์๋ ์ข ๋ฃ๋์ง๋ง, innerFunc()์ ์คํ์ปจํ ์คํธ๋ ์ ์ง๋๊ณ ์๋ค.
var c = 4;
function outer() {
var a = 1;
var b = 3;
return function inner() {
var a = 2;
console.log(b); // 3
}
}
var someFunc = outer();
someFunc();
- outer ํจ์๋ inner ํจ์๋ฅผ return ํ๊ณ ์๊ณ someFunc์๋ outer ํจ์์ ์คํ๊ฒฐ๊ณผ ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ inner ํจ์๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
- ๊ทธ๋ฐ๋ฐ, var someFunc = outer(); ์์ outer ํจ์๋ฅผ ํธ์ถํด์ ์คํ์ด ์๋ฃ๋๋ฉด outer ํจ์ ๋ด ์ง์ญ ๋ณ์๋ค์ ์ฌ๋ผ์ง ๊ฒ ๊ฐ์ง๋ง ์ฌ๋ผ์ง์ง ์๋๋ค. ๋ช๋ช ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ํจ์ ์์ ์ง์ญ ๋ณ์๋ค์ ๊ทธ ํจ์๊ฐ ์ฒ๋ฆฌ๋๋ ๋์์๋ง ์กด์ฌํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์๋ฅผ ๋ฆฌํดํ๊ณ ๋ฆฌํดํ๋ ํจ์๊ฐ ํด๋ก์ ๋ฅผ ํ์ฑํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ํด๋ก์ ๋ ํจ์์ ํจ์๊ฐ ์ ์ธ๋ ์ดํ์ ํ๊ฒฝ์ ์กฐํฉ์ด๋ค. ์ด ํ๊ฒฝ์ ํด๋ก์ ๊ฐ ์์ฑ๋ ์์ ์ ์ ํจ ๋ฒ์ ๋ด์ ์๋ ๋ชจ๋ ์ง์ญ ๋ณ์๋ก ๊ตฌ์ฑ๋๋ค.
- someFunc๋ outer์ด ์คํ๋ ๋ ์์ฑ๋ inner ํจ์์ ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ค. inner์ ์ธ์คํด์ค๋ ๋ณ์ b๊ฐ ์๋ ์ดํ์ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ค. ์ด๋ฐ ์ด์ ๋ก someFunc๊ฐ ํธ์ถ๋ ๋ b๋ ์ฌ์ฉํ ์ ์๋ ์ํ๋ก ๋จ๊ฒ๋๋ค.
- ์ฆ, ์๋๋ ํจ์ ๋ด๋ถ์ ์ ์ธํ ๋ณ์๋ ํจ์๊ฐ ๋๋๋ฉด ์ฌ๋ผ์ง์ง๋ง, ํด๋ก์ ๊ฐ ์ค์ฝํ ์ฒด์ธ์ ๊ณ์ ๋ค๊ณ ์์ผ๋ฏ๋ก outer ํจ์ ๋ด๋ถ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ผ ์ด๋ฌํ ํด๋ก์ ๋ ์ด๋์ ์จ๋จน์ ์ ์์๊น?
ํจ์์ ์บก์ํ
๋ง์ฝ ์ด๋ค ํจ์์์ ์ฌ์ฉํ๋ ์ ์ญ๋ณ์๊ฐ ์์๋, ์ด ๋ณ์๋ฅผ ๋ค๋ฅธ๊ณณ์์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๊ณ ์ถ์๋ ์ฌ์ฉํ ์ ์๋ค.
์๋์ ์ฝ๋๋ ์ ์ญ๋ณ์ age๋ฅผ ํ์ฉํด ํด๋น Person๊ฐ์ฒด์ BrotherAge๋ฅผ ๊ตฌํ๋ ์ฝ๋์ด๋ค.
var age = 13
var Person = function (){
var myBrotherAge = age - 5
console.log(myBrotherAge)
}
Person()
์์ ๊ฐ์ด ์ ์ญ๋ณ์ age๋ฅผ Person๋ด๋ถ๊ฐ ์๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ณ ์ถ๋ค๊ณ ํ์.
var Person = (function (){
var age = 13
return (function(){
var myBrotherAge = age - 5
console.log(myBrotherAge)
})
})()
Person()
์ด๋ ์์ ๊ฐ์ด ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋นํ๋ ์ ์ญ๋ณ์ age๋ฅผ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด์ง๋ค. ์ธ๋ถ์์ Person๊ฐ์ฒด๋ฅผ ํตํด ์ ๊ทผํด๋ด๋ ํด๋ก์ ํจ์๊ฐ ๋ฐํ๋๊ธฐ๋๋ฌธ์ age๋ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
๋ฃจํ์์์์ ํด๋ก์ ์ฌ์ฉ ์ ์ฃผ์์ ( ์ดํด์ ๊ณต๋ถ๊ฐ ๋ ํ์ )
function countSeconds(howMany) {
for (var i =1; i <= howMany; i++) {
setTimeout(function () {
console.log(i);
}, i * 1000 );
}
};
countSeconds(10)
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ์๋ ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋์ฌ๊ฒ ๊ฐ์๊ฐ?
์์นซ ์ฐํ๋ ๋ก๊ทธ๊ฐ 1~11๊น์ง 1์ด๋ง๋ค ์ฐํ๋ค๊ณ ์๊ฐํ ์๋ ์๊ฒ ์ง๋ง ์์ ๊ฒฐ๊ณผ๋ 11์ด 1์ด์ ํ๋ฒ์ฉ 10๋ฒ ์ฐํ๋ค.
์ฒซ๋ฒ์งธ SetTimeout์ ํจ์๊ฐ ์คํ๋๊ธฐ์ ์ ๋ฃจํ๋ฌธ์ด ๋๋๊ฒ ๋๋ฉฐ, ๋ฃจํ๋ฌธ์ ๋ฐ๋ผ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์์ธ ์๊ฐ ๋งค๊ฐ๋ณ์์ i๊ฐ์ด ์ฐจ๋ก๋ก ๋ค์ด๊ฐ์ง๋ง ์ดํ์ setTimeout๋ด๋ถ ํจ์๊ฐ ์ฐธ์กฐํ๋ i๋ ์ด๋ฏธ howMany๋งํผ ์ฆ๊ฐํ i๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ค. ์ด๋ฏธ ๋ซํ setTImeoutํจ์์ ๋ด๋ถ ํจ์์ธ ์ต๋ช ํจ์๋ ์ธ๋ถ์ i๋ฅผ ๊ณ์ ์ถ์ ํ๊ธฐ์ ์๊ธฐ๋ ๊ฒฐ๊ณผ์ธ ๊ฒ์ด๋ค.
๋ง์ฝ 10์ด ๋์ 1๋ถํฐ 11๊น์ง ๋ก๊ทธ๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด setTimeout๋ฐ์ ํจ์ํ๋๋ฅผ ๋ง์์ด ํ i๊ฐ์ ๋ณต์ ํด ์ฌ์ฉํ๋ฉด ๋๋ค.
function countSeconds(howMany) {
for (var i =1; i <= howMany; i++) {
var count = function (current){
setTimeout(function () {
console.log(current);
}, i * 1000 );
}
count(i)
}
};
countSeconds(10)
์ด๋ฌ๋ฉด ๋ด๋ถ ํด๋ก์ ํจ์๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ ๊ณ์ ๋ณํ๋ i๊ฐ ์๋ ๊ณ ์ ๊ฐ current๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.