Search
Duplicate
📒

[JavaScript/TypeScript] 04. 스코프, 클로저

상태
수정중
수업
JavaScript/TypeScript
주제
4 more properties
참고

스코프(유효범위)

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 속성은 객체의 외부에서는 접근 할 수 없는 외부에 감춰진 속성이나 메소드를 의미
두 결과값이 다른 이유는 외부함수가 실행될 때마다 새로운 지역변수를 포함하는 클로저가 생성되기 때문이다.