객체와 원시 타입의 근본적인 차이 중 하나는 객체
는 ‘참조에 의해(by reference)’ 저장되고 복사된다는 것입니다.
원시값
(문자열, 숫자, 불린 값)은 ‘값(value) 그대로’ 저장·할당되고 복사된다.
number
string
null
undefined
boolean
원시 타입의 데이터는 변수에 할당이 될 때 메모리 상에 고정된 크기로 저장이 되고 해당 변수가 원시 데이터 값을 보관한다.
원시 타입 자료형은 모두 변수 선언, 초기화, 할당 시 값이 저장된 메모리 영역에 직접적으로 접근한다. 즉, 변수에 새 값이 할당이 될 경우, 변수에 할당된 메모리 블럭에 저장된 값을 바로 변경한다.
데이터 보관함변수
한 칸에 하나의 데이터만 넣을 수 있는 원시적인
방식.
'string', 33, true, false, undefined // 데이터가 "하나"의 정보를 담고 있다.
! 변수에는 하나의 데이터만 담는다 !
-> 원시 타입은 값 자체에 대한 변경이 불가능(immutable)하지만, 변수에 다른 데이터를 할당할 수는 있다.
원시 자료형이 아닌 모든 것은 Object. Object({})
Array([])
function(){}
변수에는 특별한 데이터 보관함을 찾아갈 수 있는 주소가 담겨있고, 이 주소를 따라가보면 특별한 데이터 보관함을 찾을 수 있는데, 이 특별한 데이터 보관함에서는 자기 마음대로 사이즈를 늘렸다가 줄였다가 한다. ("동적(dynamic)으로 변한다"라고 하기도 한다.)
변수의 값이 저장된 힙heap 메모리의 주소값을 저장한다.
객체가 할당된 변수를 복사하거나 함수의 인자로 넘길 땐 객체가 아닌 객체의 참조가 복사된다.
변수에 접근할 수 있는 범위.
안쪽 스코프에서 바깥쪽 스코프로는 접근할 수 있지만 반대는 불가능.
스코프는 중첩
이 가능.
가장 바깥쪽의 스코프는 전역 스코프(Global Scope)라고 부른다.
전역이 아닌 다른 스코프는 전부 지역 스코프(local scope).
지역 스코프에 선언한 변수는 지역 변수, 전역 스코프에서 선언한 변수는 전역 변수.
지역 변수는 전역 변수보다 더 높은 우선순위를 가진다.
! 전역 변수는 최소화 해라 !
편리하지만 다른 함수 또는 로직에 의해 의도치 않은 변경이 생길 수 있다.(side effect)
전역 변수를 최소화하는 것은 side effect를 줄이는 좋은 방법.
"외부함수의 컨텍스트에 접근할 수 있는 내부함수"
"함수 내에서 다른 함수(내부 함수)가 리턴이 되면, 이 함수를 클로져 함수라고 부르고, 외부 함수에 있는 변수에 접근 가능~~~"
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에 아무런 영향을 미치지 않습니다.