참고
스코프(유효범위)
NOTE
•
변수, 상수, 매개변수가 언제 어디서 정의되는지 결정한다
•
{ } 로 범위잡아준다고 생각하면 좋다.
function f(x){
return x+3;
}
f(5) // 8
x; // ReferenceError
JavaScript
복사
•
변수가 스코프안에 있지 않으면 그 변수는 존재하지 않는가?
→ 그렇지 않다 (스코프 와 존재의 개념)
◦
스코프(가시성) : 프로그램의 현재 실행중인 부분(실행 컨텍스트)에서 보이고 접근할 수 있는 식별자를 의미함
◦
존재 : 메모리가 할당된 무언가를 가리키고 있다는 의미
•
무언가가 더는 존재하지 않는다고 자바스크립트는 메모리를 바로 회수하지 않는다
◦
주기적으로 일어나는 가비지 컬렉션 프로세스가 메모리 회수함
정적 스코프(렉시컬 스코프)
NOTE
•
어떤 변수가 함수 스코프 안에 있는지 함수를 정의할때 알 수 있다
정적 스코프 코드
전역 스코프
NOTE
•
어떤 함수도 호출하지 않았을 때 실행 흐름은 전역 스코프에 있다.
•
전역변수는 모든 함수에서 사용될수 있기에 위험하다
전역 스코프 코드
클로저
NOTE
let globalFunc; // 정의되지 않은 전역 함수
{
let blockVar = 'a'; // 블록 스코프에 있는 변수
globalFunc = function(){
console.log(blockVar);
}
}
globalFunc(); // "a"
// globalFunc는 블록 안에서 값을 할당받았습니다.
// 이 블록 스코프와 그 부모인 전역 스코프가 클로저를 형성합니다.
// globalFunc를 어디서 호출하든, 이 함수는 클로저에 들어있는 식별자에 접근할 수 있습니다.
// 일반적으로 스코프에서 빠져나가면 해당 스코프에서 선언한 변수는
// 메모리에서 제거해도 안전하다,
// 하지만 여기서는 스코프안에서 함수를 정의했고,
// 해당 함수는 스코프 밖에서도 참조할 수있으므로 자바스크립트는 스코프를 계속 유지함
let f;
{
let o = {note : "Safe"}
f = function(){
return o;
}
}
let oRef = f();
oRef.note = "Not so safe after all";
console.log(oRef.note) // Not so safe after all
JavaScript
복사
•
클로저(closure)는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것
을 말합니다.
Private Variable
NOTE
function factory_movie(title){
return {
get_title : function (){
return title;
},
set_title : function(_title){
title = _title
}
}
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
console.log(ghost.get_title()); // Ghost in the shell
console.log(matrix.get_title()); // Matrix
ghost.set_title('공각기동대');
console.log(ghost.get_title()); // 공각기동대
console.log(matrix.get_title()); // Matrix
JavaScript
복사
•
Private 속성은 객체의 외부에서는 접근 할 수 없는 외부에 감춰진 속성이나 메소드를 의미
•
두 결과값이 다른 이유는 외부함수가 실행될 때마다 새로운 지역변수를 포함하는 클로저가 생성되기 때문이다.