-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
클로저(Closure) #15
Comments
클로저(Closure)클로저는 실행 컨텍스트와 밀접한 관련이 있다. 생성된 함수 객체는
내부 함수의 이 때, 자신을 포함하는 외부 함수의 실행 컨텍스트가 소멸하여도 외부함수에서 내부함수를 반환하는 코드를 보자. function foo() {
var x = 'variable of outerFunc';
function bar() {
console.log(x);
}
return bar;
}
var innerFunc = foo();
innerFunc(); //variable of outerFunc 위의 코드를 보면 외부함수 외부함수 이처럼 클로저는 외부함수( 클로저가 외부함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는 이유를 설명한 그림이다. 외부함수인 이 때문에 외부 함수
클로저를 활용한 전역 변수의 사용 억제클로저를 활용한 대표적인 예로 카운터가 있다. var counter = 0;
function calculator() {
return console.log(++counter);
}
calculator(); //1
calculator(); //2
calculator(); //3 위의 결과는 에상대로 잘 나오고 있지만 전역 변수 var outerFunc = (function () {
var counter = 0;
function calculater() {
return console.log(++counter);
}
return calculater;
}());
outerFunc(); //1
outerFunc(); //2
outerFunc(); //3 위의 코드와 같이 클로저를 이용하면 전역 변수의 사용을 줄일 수 있다. 루프 안에서의 클로저 활용클로저를 활용하는데 있어 주의할 사항에 대해 설명할 때 가장 많이 등장하는게 이 경우다. function count(numberOfCount) {
for(var i=1; i <= numberOfCount; i++) {
setTimeout(function(){
console.log(i);
}, i*1000)
}
}
count(4); 보면 알겠지만, 위 코드의 의도는 1초 간격으로 1,2,3,4를 출력하는 것이다. 하지만 결과는 예상과 다르게 5가 4번 1초 간격으로 출력된다. 그 이유는 변수 function count(numberOfCount) {
for(var i=1; i <= numberOfCount; i++) {
(function (j) {
setTimeout(function(){
console.log(j);
}, i*1000)
}(i))
}
}
count(4); 즉시 실행 함수를 실행시켜 루프의 이러한 문제는 자바스크립트의 함수형 스코프로 인해 for 루프의 초기문에서 사용된 변수는 전역 스코프를 가지기 때문에 발생한다. ES6에서는 function count(numberOfCount) {
for(let i=1; i <= numberOfCount; i++) {
setTimeout(function(){
console.log(i);
}, i*1000)
}
}
count(4); 첫 번째 코드에서 |
🙏 Reference
The text was updated successfully, but these errors were encountered: