Jam's story
[JS] 클로저 본문
지역변수 , 전역변수
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2022.06.09 09:41:24</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<h3>ex04.html</h3>
<!-- js함수 클로저 -->
<pre>
1.js 변수- 지역(로컬) 변수, 전역변수
지역변수: 함수 호출될때 생성-> 종료 삭제
전역변수: 다른 페이지로 이동, 창닫힐때, 즉 페이지가 유지될때까지
클로저: 전역변수를 로컬(지역)에 비공개로 만들 수 있다.
</pre>
<p id="demo"></p>
<script>
var a; //전역변수
let b; //전역변수
function test(x){
//지역변수, 매개변수
var c; //지역변수
y=100; //전역변수
{
let d; //이 블럭에서만 사용 할 수 있는 지역변수
}
}
</script>
</body>
</html>
중첩함수
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2022.06.09 09:47:35</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<h3>ex04_02.html</h3>
<p id="demo"></p>
<button onclick="incCounter()">counter증가 </button>
<!-- <script>
let counter=0; //전역변수
function add(){
counter+=1;
return counter;
}
add();
add();
add();
document.getElementById("demo").innerHTML=counter;
</script> -->
<script>
//counter를 버튼 누를 때마다 누적시키자 => 전역변수로 쓰면 바로 가능하지만
//중첩함수를 사용해서 해결해보자
function add(){
//clousers
//counter를 지역변수로 선언한 이유
// 버튼을 누를때마다 함수가 호출될때마다, 초기화가 됨 (누적x)
let counter=0;
counter+=1;
return counter;
}
function incCounter(){
document.getElementById("demo").innerHTML=add();
}
</script>
</body>
</html>
클로저- 중첩함수
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2022.06.09 10:16:49</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<h3>ex04_03.html closures작업</h3>
<button onclick="incCounter()">카운터증가</button>
<p id="demo"></p>
<!-- <script>
document.getElementById("demo").innerHTML=add();
//중첩함수이해
function add(){
let counter=0;
//counter+=1; //1씩 증가 =>add()함수 안에 함수선언
function plus(){
//중첩 함수 안에서 상위(부모) 함수의 지역변수를 접근 가능
counter+=1;
}
plus();
return counter;
}
</script> -->
<script>
document.getElementById("demo").innerHTML=add();
function add(){
let counter=0;
function plus(){
counter+=1;
}
plus();
return counter;
}
</script>
<script>
//클로저
function incCounter(){
document.getElementById("demo").innerHTML=add();
}
//자체호출함수+중첩함수
//return 함수:
var add=(function (){
let counter=0; //지역변수 -> 전역변수처럼 유지
return function(){
counter+=1;
return counter;
} //중첩함수
})();
function incCount(){
document.getElementById("demo").innerHTML=add();
}
</script>
</body>
</html>
클로저를 쓰면 더 편안한 이유 예제
버튼을 누르면 그 안의 숫자 증가
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2022.06.09 10:35:59</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<h3>ex04_04.html</h3>
<button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button><button>0</button>
<script>
var btns=document.getElementsByTagName("button");
for (let i = 0; i < btns.length; i++) {
btns[i].onclick=(function(){
let counter=0;
return function(){
event.srcElement.innerHTML=++counter;
};
})();
};
</script>
<!-- //js
<script>
var btns=document.getElementsByTagName("button");
for (let i = 0; i < btns.length; i++) {
btns[i].onclick=function(){
var n=parseInt(event.srcElement.innerHTML);
event.srcElement.innerHTML=++n;
}
}
</script> -->
//jquery
<!-- <script>
$("button").click(function(event){
var n=parseInt($(this).html());
$(this).html(++n);
});
</script> -->
<!-- <script>
//카운터변수를 배열로 선언
var counters=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
$("button").click(function(event){
var idx = $(this).index();
counters[idx]++;
$(this).html(counters[idx]);
});
</script> -->
</body>
</html>
ex04_04.html
//jquery<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2022.06.09 10:55:21</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<h3>ex04_05.html -js 클로저 예제 </h3>
<script>
var counterObject=(function(){
let counter=0;
function changeBy(value){
counter+=value;
}
return{
//js객체
increment:function(){
changeBy(1);
},
decrement:function(){
changeBy(-1);
},
value:function(){
return counter;
}
};
})();
counterObject.increment();
counterObject.increment();
counterObject.increment();
document.write(counterObject.value()+"<br>");
counterObject.decrement();
document.write(counterObject.value()+"<br>");
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2022.06.09 11:15:19</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<style>
.myProgress{
width:100%;
background-color: #ddd;
border:solid 1px gray;
}
.myBar{
width:1%;
height: 30px;
background-color: #4CAF50;
text-align: right;
color:red;
}
</style>
</head>
<body>
<h3>ex04_06.html</h3>
<div id="myProgress1" class="myProgress">
<div id="myBar1" class="myBar"></div>
<button id="btn1">진행</button>
</div>
<div id="myProgress2" class="myProgress">
<div id="myBar2" class="myBar"></div>
<button id="btn2">진행</button>
</div>
<div id="myProgress3" class="myProgress">
<div id="myBar3" class="myBar"></div>
<button id="btn3">진행</button>
</div>
<div id="myProgress4" class="myProgress">
<div id="myBar4" class="myBar"></div>
<button id="btn4">진행</button>
</div>
<div id="myProgress5" class="myProgress">
<div id="myBar5" class="myBar"></div>
<button id="btn5">진행</button>
</div>
<script>
var btns=document.getElementsByTagName("button");
for (let i = 0; i < btns.length; i++) {
btns[i].onclick=function(){
var btn= event.srcElement;
var width=1;
var timer=setInterval(function(){
if(width<100){
width++;
btn.previousElementSibling.style.width=width+"%";
btn.previousElementSibling.innerHTML=width+"%";
}else{
clearInterval(timer);
}
},30);
}
}
</script>
</body>
</html>
JQuery
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>2022.06.09 11:15:19</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<style>
.myProgress{
width:100%;
background-color: #ddd;
border:solid 1px gray;
}
.myBar{
width:1%;
height: 30px;
background-color: #4CAF50;
text-align: right;
color:red;
}
</style>
</head>
<body>
<h3>ex04_06.html</h3>
<div id="myProgress1" class="myProgress">
<div id="myBar1" class="myBar"></div>
<button id="btn1">진행</button>
</div>
<div id="myProgress2" class="myProgress">
<div id="myBar2" class="myBar"></div>
<button id="btn2">진행</button>
</div>
<div id="myProgress3" class="myProgress">
<div id="myBar3" class="myBar"></div>
<button id="btn3">진행</button>
</div>
<div id="myProgress4" class="myProgress">
<div id="myBar4" class="myBar"></div>
<button id="btn4">진행</button>
</div>
<div id="myProgress5" class="myProgress">
<div id="myBar5" class="myBar"></div>
<button id="btn5">진행</button>
</div>
<script>
var btns=document.getElementsByTagName("button");
for (let i = 0; i < btns.length; i++) {
btns[i].onclick=function(){
var btn= event.srcElement;
var width=1;
var timer=setInterval(function(){
if(width<100){
width++;
btn.previousElementSibling.style.width=width+"%";
btn.previousElementSibling.innerHTML=width+"%";
}else{
clearInterval(timer);
}
},30);
}
}
</script>
</body>
</html>
var btn=$(this) , btn.prev~ 로 바꿈
$(tihs).prev,로 썼다가 다같은 this 가 아니기 때문에
ex04_06.html
'WEB > JavaScript' 카테고리의 다른 글
[JS] 새창 열고 닫기 (0) | 2022.06.09 |
---|---|
[JS] 드래그 (0) | 2022.06.09 |
[JS] function (함수) 정리 (0) | 2022.06.09 |
[JS] 이벤트 버블링 (0) | 2022.06.09 |
[JS] onclick 이벤트 처리 (0) | 2022.06.09 |
Comments