Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- pythonexe
- kosis
- argv
- 써니나타스 1번
- orge to troll
- pyinstaller
- argc
- 빅데이터
- anxi0
- 쉘코드
- IS함수
- mode함수
- lob 10번
- 결측치
- lob 7번
- R언어
- lob 9번
- lob
- kostat
- 서니나타스
- ultra argv hunter
- 자료개방포털
- 데이터형
- 범용레지스터 #레지스터 #어셈블리 #ASM #리버싱 #어셈블리어 #EAX #ESP
- pythoncli
- wolfman to darkelf
- 포너블
- 마크업 언어
- troll to
- 써니나타스
Archives
- Today
- Total
ANX1-Z3R0의 불안극복(不安克服)
Closure 본문
우리는 보통 함수의 흐름이 return시엔 모든 게 끝나는 걸로 알고 있다.(사실은 그렇진 않고 실행이 끝난 후 GC가 메모리를 수거해가는 형태)
많은 언어들이 지역변수는 함수가 처리되는 동안에만 사용가능하도록 설계되어있다.
function counter() {
var count = 0;
return function() {
count++;
console.log("Counter is ", count);
}
}
var cnt = counter();
cnt();
cnt();
하지만 이 코드는 수거됐을 법한 count의 값을 정상적으로 처리해서 출력해준다. (화려한 부활?)
그건 아니고 클로저 안에 정의된 함수는 만들어진 환경을 ‘기억한다’. 따라서 안에서 활성화된 변수를 자유 변수라고 하고, 함수와 함께 기억되는 것이다.
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
};
}
for (var j = 0; j < arr.length; j++) {
console.log(arr[j]()); //5 5 5 5 5
}
순서대로 잘 작동할 것 같지만,
첫번째 반복문에서 i가 자유변수가 되므로, 값을 저장하는데, 이미 반복문을 다 돌아버려서 5라는 값이 있으므로,
arr[0]=function(){return 5;}
arr[1]=function(){return 5;}
arr[2]=function(){return 5;}
arr[3]=function(){return 5;}
arr[4]=function(){return 5;}
메모리에 이렇게 저장된다.
이것을 방지하기 위해선 의외로 간단하다.
i를 let을 사용하여 지역변수로 만들면 된다. (자유변수 탈출)
'CODING > [JavaScript] Useful' 카테고리의 다른 글
IIFE(Immediately Invoked Function Expression) pattern (0) | 2020.11.19 |
---|---|
javascript .reduce() 함수 (0) | 2020.11.16 |
Comments