일반 객체와 일급 객체를 비교하여 설명해주세요.
일급 객체란
→ 일급객체인 함수는 일반 객체와 다르게 호출 가능, 함수 고유의 프로퍼티를 소유
일반 함수와 화살표 함수의 this의 차이점을 설명해주세요.
일반 함수는 함수가 어떻게 호출됬는지에 따라 동적으로 결정된다. 또한 일반함수로서 호출되는 모든 함수 내부의 this는 전역객체를 가리킨다.
화살표함수는 함수 자체의 this 바인딩을 갖지 않는다. 따라서 화살표 함수 내부에서 this를 참조하면 상위 스코프의 this를 그대로 참조한다. → lexical this 즉 화살표 함수의 this는 함수가 정의된 위치에 의해 결정된다.
순수 함수와 비순수 함수의 차이에 대해 얘기해주시고, 함수형 프로그래밍의 장점은 무엇인지 설명해주세요.(p186)
순수 함수란 함수형 프로그래밍에서 어떤 외부 상태에 의존하지도 않고 변경하지도 않는, 즉 부수 효과가 없는 함수를 말한다. 따라서 순수 함수는 동일한 인수가 전달되면 언제나 동일한 값을 반환한다. 외부 상태에 의존하지 않아도 → 현재 시간에 따라(결국은 외부상태이므로) 호출 상태가 변화하여 반환값이 달라지면 순수함수가 아니다.
비순수 함수는 외부 상태에 따라 반환값이 달라지는 함수이다. 즉 전역 변수, 서버 데이터, 파일 등에 의존하는 함수를 말한다. 또한 외부 상태를 변경하는 부수 효과가 있어서 상태 변화를 추적하기 어려워지므로 비순수함수 사용을 최대한 줄여서 부수 효과를 억제하는 것이 좋다.
함수형 프로그램은 결국 순수 함수를 통해 부수 효과를 최대한 억제해 오류를 피하고 프로그램의 안전성을 높이려는 노력의 일환이다.
객체를 리터럴로 생성하는 것과 생성자 함수를 통해 생성하는 방법의 차이점은 무엇인가요?
객체를 리터럴로 생성하는 것은 변수에 중괄호를 넣어서 생성하는데 단 하나의 객체만 생성할 수 있다. 간편하지만 동일한 프로퍼티 구조를 갖는 객체를 여러개 생성해야할 경우 비효율적이다. 생성자 함수를 통해 객체를 생성하면 같은 프로퍼티 구조를 갖는 객체를 여러 개 생성할 수 있어서 효율적으로 생성할 수 있다.
함수가 호출될 때, 자바스크립트 엔진에서 동작하는 원리는 얘기해주시고, 일반 함수로 호출될 때와 생성자 함수를 통해 호출될 때의 차이점을 설명해주세요. 이를 기반으로 함수 호이스팅 관점에서 함수 표현식을 사용하는 것이 좋은 이유도 함께 설명해주세요.
자바스크립트에서 함수는 호출되기 위한 내부 메서드인 [[Call]]
,[[Construct]]
를 가지고 있는데 일반 함수로서 호출되면 [[Call]]
이 호출되고, new 연산자와 함께 생성자 함수로 호출되면 [[Construct]]
가 호출된다.
모든 함수는 호출이 가능하므로 [[Call]]
가지고 있지만 모든 함수가 [[Construct]]
가지고 있지 않다. [[Construct]]
가지고 있지 않는 non-constructor를 생성자 함수로 호출할 경우 에러가 발생한다.
함수 표현식을 사용하는 것이 좋은 이유는 함수 선언문으로 함수를 정의하면 변수 호이스팅과 달리 정의한 함수를 함수 선언문 이전에 호출하면 호출이 된다는 것.
함수를 표현식으로 정의할 경우 함수 호이스팅이 아닌 변수 호이스팅이 되어서 함수 표현식 이전에 함수를 참조하면 undefined로 평가된다.
함수 호이스팅은 함수를 호출하기 전에 반드시 함수를 선언해야하는 규칙을 무시하므로 표현식을 사용하여 변수 호이스팅하게끔 만들어줘야 한다.