[TIL 13] 데이터 타입 / 스코프 / 클로저

yezo cha·2021년 5월 28일
0

JavaScript

목록 보기
6/19

원시 자료형 / 참조 자료형

객체와 원시 타입의 근본적인 차이 중 하나는 객체‘참조에 의해(by reference)’ 저장되고 복사된다는 것입니다.
원시값(문자열, 숫자, 불린 값)은 ‘값(value) 그대로’ 저장·할당되고 복사된다.

primitive type data

number string null undefined boolean
원시 타입의 데이터는 변수에 할당이 될 때 메모리 상에 고정된 크기로 저장이 되고 해당 변수가 원시 데이터 값을 보관한다.
원시 타입 자료형은 모두 변수 선언, 초기화, 할당 시 값이 저장된 메모리 영역에 직접적으로 접근한다. 즉, 변수에 새 값이 할당이 될 경우, 변수에 할당된 메모리 블럭에 저장된 값을 바로 변경한다.
데이터 보관함변수 한 칸에 하나의 데이터만 넣을 수 있는 원시적인 방식.

'string', 33, true, false, undefined // 데이터가 "하나"의 정보를 담고 있다.

! 변수에는 하나의 데이터만 담는다 !
-> 원시 타입은 값 자체에 대한 변경이 불가능(immutable)하지만, 변수에 다른 데이터를 할당할 수는 있다.

reference type data

원시 자료형이 아닌 모든 것은 Object. Object({}) Array([]) function(){}
변수에는 특별한 데이터 보관함을 찾아갈 수 있는 주소가 담겨있고, 이 주소를 따라가보면 특별한 데이터 보관함을 찾을 수 있는데, 이 특별한 데이터 보관함에서는 자기 마음대로 사이즈를 늘렸다가 줄였다가 한다. ("동적(dynamic)으로 변한다"라고 하기도 한다.)
변수의 값이 저장된 힙heap 메모리의 주소값을 저장한다.
객체가 할당된 변수를 복사하거나 함수의 인자로 넘길 땐 객체가 아닌 객체의 참조가 복사된다.

스코프 Scope

변수에 접근할 수 있는 범위.
안쪽 스코프에서 바깥쪽 스코프로는 접근할 수 있지만 반대는 불가능.
스코프는 중첩이 가능.
가장 바깥쪽의 스코프는 전역 스코프(Global Scope)라고 부른다.
전역이 아닌 다른 스코프는 전부 지역 스코프(local scope).
지역 스코프에 선언한 변수는 지역 변수, 전역 스코프에서 선언한 변수는 전역 변수.
지역 변수는 전역 변수보다 더 높은 우선순위를 가진다.

스코프의 종류

  • 블록 스코프(block scope) : 중괄호를 기준으로 범위가 구분됨.
    • 화살표 함수블록 스코프. 함수 스코프가 아니다.
  • 함수 스코프(function scope) : 함수로 둘러싼 범위.

! 전역 변수는 최소화 해라 !
편리하지만 다른 함수 또는 로직에 의해 의도치 않은 변경이 생길 수 있다.(side effect)
전역 변수를 최소화하는 것은 side effect를 줄이는 좋은 방법.

클로저 Closure

"외부함수의 컨텍스트에 접근할 수 있는 내부함수"
"함수 내에서 다른 함수(내부 함수)가 리턴이 되면, 이 함수를 클로져 함수라고 부르고, 외부 함수에 있는 변수에 접근 가능~~~"

let add = function(x) {
  let sum = function(y) {
    return x + y;
  }
  return sum;
}

let foo = add(1);
foo(3);
let total = foo(6);


함수 add는 x를 매개변수로 하며, 함수 sum을 반환합니다.
add는 매개변수 x를 통해 전달받은 값을 내부함수 sum에게 내려줍니다.
여기서 sum은 외부함수인 add의 변수 x에 접근할 수 있으므로 클로저입니다.

total의 값인 foo(6),add(1)(6)과 같습니다. 
따라서 total은 7입니다.

foo(3)은 무엇일까요? foo(3)이 실행되면 4가 반환되지만, 
  이 값은 어떠한 변수에도 할당이 되지 않았으므로 total에 아무런 영향을 미치지 않습니다.
profile
(ง •̀_•́)ง

0개의 댓글