클로저.. 너무 어렵다 🔥
그래서 이건 꼭 기록으로 남겨두어야겠다고 생각이 들었다 !
let x = 'global';
function ex() {
x = 'change';
}
ex();
console.log(x); // 'change'
➡️ 위 코드에서 전역변수의 x값이 change로 변경 되었다 .
함수 ex()안에서 전역변수 x의 값을 재할당해주었기 때문에 (새로선언 X )
var x = 'global';
function ex() {
var x = 'local';
x = 'change';
}
ex(); // x를 바꿔본다.
console.log(x); // 여전히 'global'
➡️ 위 코드에서 전역변수의 x값이 global로 유지되었다 .
함수 ex( )안에서 지역변수 x를 새로 선언했기 때문에 ( let )
( 함수 스코프 내에 변수 x가 선언되어 있기 때문에 )
➡️ 전역스코프에 있는 x의 값에 스코프 체인을 통해 도달하지 않았음
➡️ ex( ) 함수스코프 내에서만 x = 'change'
➡️ ex( ) 함수스코프 외부에서 x = 'global'
var name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
name = 'nero';
log();
}
wrapper(); // 'nero'
log( ) 내의 name은 전역스코프 name을 가리키는 것임 !
➡️ log( )는 wrapper( ) 함수스코프 내에서 호출 되었지만 선언 된 것은 전역스코프임
➡️ wrapper ( ) 내부에서 변수 name의 값을 'nero'로 재할당 해줌
var name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
var name = 'nero';
log();
}
wrapper(); //
log( ) 내의 name은 전역스코프 name을 가리키는 것이기 때문에 !
➡️ log( )는 wrapper( ) 함수스코프 내에서 호출 되었지만 선언 된 것은 전역스코프임
➡️ wrapper ( ) 내에서 let으로 선언 된 name 은 해당 함수 내에서만 사용할 수 있는 지역변수임
➡️따라서, log ( )에서의 name은 상위스코프인 전역에서 선언 된 name = 'zero'를 반환할 수 밖에 없음 !
: 함수와 그 주변함수 상태의 주소집합
( 함수와 그 함수가 접근할 수 있는 변수의 조합 , 해당함수에서 사용할 수 있는 변수들 )
function outerFunc() {
var x = 10;
var innerFunc = function () { console.log(x); };
innerFunc();
}
outerFunc(); // 10
function outerFunc() {
var x = 10;
var innerFunc = function () { console.log(x); };
return innerFunc;
}
/**
* 함수 outerFunc를 호출하면 내부 함수 innerFunc가 반환된다.
* 그리고 함수 outerFunc의 실행 컨텍스트는 소멸한다.
*/
var inner = outerFunc();
inner(); // 10