[JavaScript]자바스크립트_스코프 클로저
2021. 8. 9. 17:36ㆍWeb_Programming/JavaScript
💻 핵심
클로져
함수가 속한 렉시컬 스코프를 기억하여 렉시컬 스코프 밖에서도 스코프에 접근가능하도록 해주는 기능
예제
function foo(){
var a=2;
function bar(){
console.log(a);
}
return bar();
}
var baz= foo();
baz(); //2
함수 bar()는 foo() 내부 렉시컬 스코프에 존재하고, 이 bar()는 foo() 스코프에 대한 클로저를 가집니다.
변수에 foo()를 대입하여, 반환된 bar()함수를 호출하여, bar() 를 렉시컬 스코프 외부에서 실행
💡 bar()는 foo()의 호출이 끝나더라도, 여전히 해당 스코프에 대한 참조를 가짐 : 클로저
함수는 처음 선언된 곳의 스코프에 대한 참조를 유지
👉 어디에서 해당 함수를 실행하든 클로저 작용
💻 반복문과 클로져
for(var i =1; i<=5; i++){
setTimeout(function timer(){
console.log(i);
}, i*1000);
}
해당 반복문은 6만 5번이 출력된다.
반복문안의 총 5개의 함수(setTimeOut)가 모두 같이 글로벌 스코프를 공유하고, 이에 변수 i가 반복문이 끝날 때의 수 6을 사용하기 때문입니다.
👉 각 스코프의 자체 변수 사용
for(var i =1; i<=5; i++){
(function(){
var j = i;
setTimeout(function timer(){
console.log(i);
}, i*1000);
})();
}
👉 let 선언문 사용 (하나의 블록 스코프 별 변수)
for(let i =1; i<=5; i++){
setTimeout(function timer(){
console.log(i);
}, i*1000);
}
💻 모듈
클로져를 자바스크립트 모듈 패턴으로 이용가능
💡 모듈 패턴
function CoolModule() {
var something = "cool";
var another = [1, 2, 3];
function doSomething() {
console.log( something );
}
function doAnother() {
console.log( another.join( " ! " ) );
}
return {
doSomething: doSomething,
doAnother: doAnother
};
}
var foo = CoolModule();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3
👉 CoolModule함수를 호출하여 foo라는 인스턴스를 생성
👉 내장 함수들에 대한 참조를 가진 객체 를 반환하여 모듈 처럼 사용가능
+ 내장 데이터 변수에 대한 참조는 비공개로 숨겨져 있음.
싱글톤 패턴 (IIFE사용)
var foo = {function CoolModule() {
var something = "cool";
var another = [1, 2, 3];
function doSomething() {
console.log( something );
}
function doAnother() {
console.log( another.join( " ! " ) );
}
return {
doSomething: doSomething,
doAnother: doAnother
};
}();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3
📍 모듈 패턴 조건
- 최외곽 함수가 존재하고, 최소 한번은 호출
- 최외과 함수는 최소 하나의 내부 함수 반환
반응형
'Web_Programming > JavaScript' 카테고리의 다른 글
[JavaScript]자바스크립트 호이스팅 (0) | 2021.08.03 |
---|---|
[JavaScript]자바스크립트 블록 스코프 (0) | 2021.08.02 |
[JavaScript]자바스크립트 함수 스코프 (0) | 2021.07.31 |
[JavaScript]자바스크립트, 렉시컬 스코프 (0) | 2021.07.28 |
[JavaScript] 자바스크립트 스코프 (0) | 2021.07.20 |