๐ "Javascript Closure"์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด ๋ง์นจ๋ด ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ์ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
11132 ๋จ์ด beginnersjavascriptfrontendprogramming
๐ ๊ธฐ๋ฅ ์ค ๊ธฐ๋ฅ
โผ ํจ์์์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
function outer(){
function inner(){
alert("poland");
}
}
outer(); // unfortunately, nothing happens
โผ ๋ด๋ถ ํจ์๋ฅผ ์คํํ๊ธฐ ์ํด ์ด๋ ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
function outer(){
function inner(){
alert("poland");
}
inner() // here !!!!!
}
outer() // "poland" !
๐ ์ต๋ช ๊ธฐ๋ฅ
์ด์ ์ฃผ๋ฌธ์ ์คํํ๋ ๊ฒ์
- execute outer()
- declare inner()
- execute inner()
๋ฒ๊ฑฐ๋กญ์ง ์๋? ๐
์, ์ต๋ช ํจ์๋ก
alert("poland")
๋ฅผ ๋ ์งง๊ฒ ์คํํ ์ ์์ต๋๋ค.( function(){ alert("poland"); } )(); // "poland"
๐ ํจ์๋ฅผ ๋ฐํํ๋ ํจ์
(2๋ถ ์์ ์ต์ข ์ ์ผ๋ก ํด๋ก์ ๊ฐ ๋ฌด์์ธ์ง ์ ์ ์์ต๋๋ค)
โผ ํจ์๋ Javascript์์ ํจ์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
function outer(){
var inner = function (){
alert("poland");
}
ใใreturn inner;
}
var func = outer();
func();// "poland"
โผ ์ฝ๊ฐ ๋ณํํ์ฌ ๋ด๋ถ ํจ์๋ฅผ ์ ์์ ์ผ๋ก ์ ์
function outer(){
function inner (){ //** here
alert("poland");
}
ใใreturn inner;
}
var func = outer();
func();// "poland"
โผ ์ด์ inner()๋ฅผ ์ญ์ ํ๊ณ ์ต๋ช ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
function outer(){
return function(){ //** here
alert("poland");
}
}
var func = outer();
func();// "poland"
โผ ๊ทธ๋ฐ ๋ค์ ์กฐ๊ธ ์ ํํ๋ฉด ๊ฒฝ๊ณ ๊ธฐ๋ฅ ์ ์ ๋ฌธ์์ด "poland"๋ฅผ ์ ์ธํฉ๋๋ค.
function outer(){
return function(){
var country = "poland"
alert(country);
}
}
var func = outer();
func();// "poland"
โผ -- โญ ์ค์!! -- ๋ง์ง๋ง์ผ๋ก var country๋ฅผ ๋ด๋ถ ์ต๋ช ํจ์ ์ธ๋ถ๋ก ์ด๋ํฉ๋๋ค.
function outer(){
var country = "poland"
return function(){
/** โญ โญ โญ โญ โญ โญ โญ โญ
looks like we can't see country
because country is declared outside anonymous function.
But we can see it, this is typical closure
โญ โญ โญ โญ โญ โญ โญ โญ **/
alert(country);
}
}
var func = outer();
func();// "poland"
console.log(country) // โญ undefined because of scope
โผ์ด ๋์ผ๋ก ์ฝ๊ฒ ๋ณผ ์ ์์ต๋๋ค
๐ ์ค์ํ ์์ 1
ํ์์ ๋ํ ์ผ๋ฐ์ ์ธ ์ง๋ฌธ์ด ์์ต๋๋ค.
define function that return 1,2,3... each time you call it
๋ฉด์ ์์ ๋ฌผ์ด๋ณด๋ฉด ์ด์ํ์ง ์์
function outer(){
var num = 1;
returnใfunction (){
alert(num);
x ++;
};
}
var func = outer();
func(); // 1
func(); // 2
func(); // 3
console.log(num) //undefined
๊ทธ๋ฆฌ๊ณ ์ค์ํ ๊ฒ์ด ํ๋ ๋ ์์ต๋๋ค.
ํด๋น ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด "num"์ ์ธ๋ถ ํจ์ ์ธ๋ถ๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก ํด๋ก์ ๋ก ๊ฐ์ธ ๋ณ์์ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
๐ ์ค์ํ ์์ 2
์์งํ ์์ 1์ ์ด ์ง์์ ์๋ ๊ฒ์ด ์ค์ํจ์๋ ๋ถ๊ตฌํ๊ณ "์ค์ "์์ ๋ฅผ ์ ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
ํ์ง๋ง ์ด์ ์ข ๋ ์ค์ ์ฌ๋ก๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ์ผ๋ฐ์ ์ธ jquery ์ฝ๋์ ๋๋ค.
// anonymous function
$('.button').click(function(){
alert('Hi!');
});
๊ทธ๋ฌ๋ฉด 2๋ฒ ์ด์ ํด๋ฆญ์ ๋ฐฉ์งํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์์ต๋๋ค.
$(function(){
var isClicked = false;
$('.button').click(function(){
if (isClicked) {
alert('you have already clicked once !!');
return false;
}
isClicked = true;
});
});
์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
์ฐธ์กฐ:
https://qiita.com/takeharu/items/4975031faf6f7baf077a
http://dqn.sakusakutto.jp/2009/01/javascript.html
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ "Javascript Closure"์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด ๋ง์นจ๋ด ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ์ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/kaziusan/javascript-closure-i-think-you-can-get-what-it-is-finally-after-reading-this-14d6ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค