1. 원시 값과 참조 값

  • ECMAScript의 변수는 원시 값(단순 데이터)과 참조 값(객체)을 저장할 수 있다.
  • 변수에 값을 저장하면 자바스크립트 엔진에서 원시 값인지 참조 값인지 판단함.
  • 자바스크립트는 메모리에 직접 접근하는 것을 허용하지 않아 객체를 조작할 때는 해당 객체의 참조를 조작하는 것.

  • 동적 프로퍼티
    * 동적으로 프로퍼티를 추가할 수 있는 값은 참조 값(객체) 뿐이다.
var person = new Object();
person.name = "Nicholas";
alert(person.name); //"Nicholas";

var name = "Nicholas";
name.age = 27;
alert(name.age); // undefined
  • 값 복사
    * 변수의 값을 다른 변수에 대입하면 원시 값은 그대로 복사 된다.
    * 참조 값을 복사하면 실제로 복사가 아니라 같은 객체를 참조하게 되는 것이다.
    * 그래서 참조를 복사하게 된 변수는 하나의 값을 바꾸면 다른 변수에도 적용된다.

  • 매개변수 전달
    * ECMAScript의 함수 매개변수는 모두 값으로 전달된다. (매개변수로 값이 복사됨) * 중요한건 원시 값도, 참조 값도 매개변수로 전달되는 것은 값으로 복사됨

  • 타입 판별
    * typeof는 원시 값에 대해서만 잘 동작함 참조값은 무조건 ‘object’로 표기됨 * instanceof 는 참조 값의 객체를 구별할 수 있음. (boolean 값으로 리턴함)

color instanceof Array
pattern instanceof RegExp

2. 실행 컨텍스트와 스코프

실행 컨텍스트

  • 실행 컨텍스트는 데이터에 접근과 행동을 규정하는 자바스크립트에서 중요한 개념
  • 웹 브라우저에서 컨텍스트를 window라 부르는데 전역 변수와 함수는 모두 window객체의 프로퍼티 및 메서드로 생성됨.
  • 실행 컨텍스트는 포함된 코드가 모두 실행될 때 파괴됨.
  • 파괴될 때는 컨텍스트 내부에 정의된 변수와 함수도 함께 파괴됨.
  • 전역 컨텍스트는 웹페이지를 나갈때나 브라우저를 닫을 때 까지 계속 유지됨.
  • 실행 컨텍스트의 라이프 사이클 1. 함수를 호출하면 실행 컨텍스트가 생성된다. 2. 함수가 생성될 때마다 함수의 컨텍스트가 컨텍스트 스택에 쌓인다. 3. 함수 실행이 끝나면 스택에서 꺼내고 컨트롤을 이전 컨텍스트에 반환한다.

스코프 체인

  • 스코프 체인은 실행 컨텍스트가 접근할 수 있는 모든 변수와 함수에 순서를 정의하는 것이다.
  • 컨텍스트에서 코드를 실행하면 변수객체에 스코프 체인이 만들어진다.
  • 스코프체인의 앞에는 항상 코드가 실행되는 컨텍스트의 변수 객체이다.
  • 컨텍스트가 함수라면 활성화 객체를 변수 객체로 사용한다.
  • 활성화 객체는 항상 arguments 변수 단 하나로 시작한다. (이 변수는 전역 컨텍스트에는 존재하지 않음)
  • 변수 객체의 다음 순서는 해당 컨텍스트를 포함하는 컨텍스트(부모 컨텍스트)이며 그 다음은 다시 부모의 부모 컨텍스트 이다.
  • 전역 컨텍스트에 도달할 때까지 계속 된다.
  • 전역 컨텍스트의 변수 객체는 항상 스코프 체인의 마지막에 존재한다.
  • try-catch문의 catch블록과 with문은 스코프체인을 확장할 수 있으며 이 안에서 생성하는 객체는 부모 컨텍스트에서 사용할 수 있다.
  • 자바스크립트에서는 블록레벨 스코프가 없다. (for 문에서 생성하는 변수도 블록 밖에서 사용가능함)

3. 가비지 콜렉션

  • 자바스크립트는 코드 실행 중 메모리를 관리한다.
  • 표시하고 지우기 방법
    * 메모리에 저장된 변수 전체에 표시를 하고
    * 컨텍스트에 있는 변수를 참조하는 변수는 표시를 지우고
    * 표시가 남아있는 변수는 지운다.
  • 참조 카운팅 방법
    * 변수를 선언하고 참조 값이 할당되면 카운트가 1이다.
    * 다른 변수가 같은 값을 참조하면 카운트가 늘어나고
    * 해당 값을 참조하는 변수가 다른 값을 할당하면 카운트가 줄어든다.
    * 이렇게 카운트가 0이되면 가비지 컬렉터가 실행될때 회수된다.
    * 하지만 이 방식은 순환참조가 생기면 메모리가 회수되지 않는 문제가 있다.
  • 가비지 컬렉터는 변수가 많으면 비용이 많이 드는 작업이다.
  • 웹페이지에서 사용할 수 있는 메모리는 다른 애플리케이션에 비해 매우 적기 때문에 최소한의 메모리만 사용해야 페이지의 성능을 올릴 수 있다.
  • 필요없어진 데이터는 null을 할당해서 참조를 제거하는게 좋다. (수동으로 참조 제거해야 할 대상은 전역 변수와 객체이다)