JavaScript
비교 연산자
script 언어는 equals()가 없고 연산자로만 표현한다.
== 는 기존 equals()와 동일하다.
===와 !==는 타입까지 비교할 때 사용한다.
특수 연산자
delete
객체(Object), 개체의 속성(Property), 배열의 특정 인덱스에 있는 원소를 지우는 연산자이다. var 키워드로 선언된 변수는 삭제할 수 없다.
delete가 실행 가능하면, 속성이나 원소가 undefined로 설정된다. 이때 배열의 길이에는 변화가 없다.
실행이 가능하면 true를 반환하고, 실행이 불가능하면 false를 반환한다.
정의할 필요 없이 한 번 쓰고 버리는 변수나 함수 같은 경우 delete 연산자 사용 시 메모리 관리에 효율적이다.
in
저장된 객체에 해당되는 속성이 있으면 true를 반환한다.
throw
throw문은 인위적으로 에러를 발생시킨다.
표현식에 문자열, 숫자, 오브젝트 값들을 전달할 수 있으며 throw 문을 작성하지 않고도 별도의 함수를 처리할 수 있다.
가장 좋은 방법은 오브젝트 형으로 틀을 만들어서 전달하는 게 좋다고 볼 수 있다.
함수
중복되는 로직을 하나의 기능으로 분리하여 재사용할 수 있게 해주는 역할을 하며 각 기능을 독립 호출하므로 함수 사용 시 유지보수가 쉽다.
함수 표현문은 변수에 할당할 수 있다.
자바스크립트에서 함수 표현문은 익명 함수, 기명 함수, 즉시 실행 함수가 존재하는데 기명 함수는 거의 쓰이지 않는다.
함수 선언문으로 선언한 함수는 언제 어디서든 사용할 수 있지만 익명 함수(함수 표현문)는 변수가 선언되고 나서야 실행될 수 있다.
익명 함수
var foo = function() {
console.log('foo');
}
즉시 실행 함수
(function foo() {
console.log('foo');
})(2, 3);
Execution Context (실행 문맥, EC)
중괄호에서 모든 소스 코드가 실행되니, 코드 실행 시 중괄호를 실행 문맥이라 한다.
어려워!
Scope Chain
어려워!
❓ 함수가 중첩 함수일 때 상위 함수의 유효 범위까지 흡수하는 것이다. ❓
함수는 함수 객체이며 코드에서 접근할 수 없는 내부 property 중 하나로 [[scope]]라는 property 객체를 가지고 있다.
Scope는 객체의 참조 정보들을 가지고 있으며 이 정보들을 집합의 Scope Chain이라 한다.
함수의 Scope Chain에 있는 각 객체를 변수 객체(Variable Object)라고 부르며, 변수 객체는 변수 항목을 [키-값] 형태로 표현한다.
Scope Chain은 함수가 접근할 수 있는 데이터를 결정한다.
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
var result = add(10, 1);
console.log(result);
함수를 선언하고 JVM이 읽을 때 이 함수에 대한 스코프 체인을 자바스크립트 엔진이 따로 만든다.
변수 객체는 sum, result 같은 변수들이 변수 객체라는 공간에서 관리되고, 그 공간에서 가져와서 출력되는 것이다.
1. 변수의 검색은 Scope Chain에서만 탐색한다.
2. Scope Chain의 하위에서부터 상위로 등록된 변수가 있는지 찾아가며 가장 처음에 탐색되는 Scope에 등록된 변수를 이용한다.
3. Scope Chain에 의해 탐색되지 않는 변수가 undefined이다.
I got it