티스토리 뷰
출처 : medium.com/@alvin.h/oop-js-7-%ED%81%B4%EB%A1%9C%EC%A0%80-8e5adbe67722
간단예제
var glo = 'global';
function outer() {
var out = 'out';
function inner() {
var a = 'in';
//var out = 'inner-out'
console.log(a);
console.log(out);
console.log(glo);
}
inner();
}
function outer2() {
var out = 'out';
function inner() {
var a = 'in';
//var out = 'inner-out'
console.log('outer2 : ' + a);
console.log('outer2 : ' + out);
console.log('outer2 : ' + glo);
}
return inner;
}
var outerReturn = outer2(); // closure반환
outerReturn(); // closure 실행
console.log(outerReturn);
<script>
function closureTest(a){
// return되는 함수가 클로저
// 클로저란 특정 함수 내에 정의된 지역 변수(Local Variable)를 외부에서도 참조(By Reference) 할 수 있는 함수
return function(b){
return a + b;
}
}
var test = closureTest(1); // a = 1 인수로 “1”을 지정하면 중첩 함수인 클로저는 그 값을 참조한다.
// test = function(b) {
// return 1 + b // 최종적인 클로저는 ‘인수로 받은 b에 기존에 포인터로 가지고 있던 “1”을 더해서 반환
// }
//alert(test(2)); // b = 2
function buildList(list) {
var result = []; //함수를 담을 배열
for(var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {alert(item + ' ' + list[i])} );
// 클로저 안의 list[[i]가 undefined로 나타남.
// item과 list[i] 값은 result 배열에 push 될 때, 값 자체가 복사되서 들어가는 것이 아니라 참조되어 들어간다.
}
return result; // 함수 담은 배열 반환시 i의 값은 3이므로 list[[i]가 undefined로 나타나고 item도 마지막값이 item3으로 보인다.
}
function testList() {
var fnlist = buildList([1,2,3]);
for(var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
testList();
function buildList2(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
// “i”의 값을 익명 함수의 매개변수로 넘겨 “ii” 인자 변수로 받음으로써 “i” 변수의 참조에서 벗어날 수 있다.
(function(ii) {
var item = 'item' + list[ii]; // ii는 상수가 된다.
result.push( function() {alert(item + ' ' + list[ii])} );
})(i);
}
return result;
}
function testList2() {
var fnlist = buildList2([1,2,3]);
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
testList2();
</script>
------------
<div id="div0">click div0</div>
<div id="div1">click div1</div>
<div id="div2">click div2</div>
function func(i) {
return function() {
console.log('div' + i);
}
}
for(var i=0; i< 3; i++) {
document.getElementById('div'+i).addEventListener('click',
func(i)
)
}
function add() {
var num=0;
return function(){
console.log(num);
num++;
}
}
var fn = add();
for(var i=0; i< 3; i++) {
fn();
}
'Skill > html js css' 카테고리의 다른 글
[JQuery] select option 값 조회 (0) | 2020.09.24 |
---|---|
[js] apply() 사용하기 (0) | 2020.09.22 |
Javascript 기반의 압축 라이브러리, jszip (0) | 2020.09.20 |
GNB·LNB·SNB·FNB 용어 설명 (0) | 2020.09.19 |
[JQuery] splitter 사용법 (0) | 2020.09.17 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- border-collapse
- 진열사랑
- $.extend
- spring
- devtools
- Javascript
- springboot
- getter
- $.each
- object key
- DatePicker
- element위치
- CSS
- setter
- JQuery
- ul li로 테이블
- Keycode
- sumifs
- oracle
- 전후방탐색
- @ExceptionHandler
- excel
- 여러 컬럼 update
- 프로젝트명변경
- caniuse
- QueryDSL
- PostgreSQL
- lombok
- 정규식
- draw.io
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함