기본 function 함수와 화살표 함수의 차이를 알고있나요?
자바스크립트에서 함수를 정의하는 방법은 몇가지가 있나요?
함수 선언문과 함수 표현식은 어떤 차이가 있나요?
즉시 실행 함수(IIFE)에 대해 알고 있나요? 알고 있다면 아는 내용에 대해 말해보세요
수학에서의 함수는 입력을 받아 출력을 내보내는 일련의 과정을 정의한 것.
프로그래밍 언어의 함수는
일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것.
프로그래밍 언어의 함수도 입력을 받아서 출력을 내보낸다.
함수 내부로 입력을 전달받는 변수를 매개변수
입력을 인수
출력을 반환값이라 한다.
함수는 함수 정의를 통해 생성한다.
//함수 정의
function add(x,y){
return x+y;
}
//함수 호출
add(1,2); //3
const add = (x,y) => x+y;
console.log(add(2,3)); //5
화살표 함수는 인스턴스를 생성할 수 없어서 prototype 프로퍼티가 없고 프로토타입도 생성하지 않는다.
const Foo = () => {};
// 화살표 함수는 생성자 함수로서 호출 할 수 없다.
new Foo() //TypeError : Foo is not a constructor
일반 함수는 중복된 매개변수 이름을 선언해도 에러가 발생하지 않는다.
단, strict mode에서 중복된 매개변수 이름을 선언하면 에러가 발생한다.
화살표 함수에서도 중복된 매개변수 이름을 선언하면 에러가 발생한다.
화살표 함수는 this,arguments,super,new,target 참조하면, 스코프 체인을 통해 상위 스코프의 this,arguments,super,new,target 를 참조한다.
function add(x,y){
return x+y;
}
var add = function(x,y){
return x+y;
}
var add = new Function('x','y', 'returnx+y');
var add = (x,y) => x+y;
변수는 선언한다. 함수는 정의한다로 표현한다.
함수 선언문이 평가되면 식별자가 암묵적으로 생성되고 함수 객체가 할당된다.
함수 선언문은 표현식이 아닌 문이다.
function add(x,y){
return x+y;
}
//undefined
그래서 함수 선언문을 실행하면 완료 값 undefined가 출력된다.
만약 표현식인 문이라면 완료 값 undefined 대신 표현식이 평가되어 생성된 함수가 출력되어야된다.
표현식이 아닌 문은 변수에 할당 할 수 없다.
함수 선언문도 표현식이 아닌 문이라 변수에 할당 할 수 없다.
자바스크립트는 함수의 객체 타입의 값이다.
자바스크립트의 함수는 값처럼 변수에 할당 할 수도 있고, 프로퍼티 값이 될 수도 있고, 배열의 요소가 될 수도 있다.
이처럼 값의 성질을 갖는 객체를 일급 객체라고 한다.
자바스크립트 함수는 일급 객체이다.
함수가 일급 객체라는 건, 함수를 값처럼 자유롭게 사용할 수 있다는 의미이다.
함수는 일급객체이므로 함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있다.
함수 정의 방식을 함수 표현식이라고 한다.
함수 선언식은 함수 전체를 호이스팅한다.
정의된 범위의 맨 위로 호이스팅이 되서 함수 선언전에 함수를 사용할 수 있다.
함수 표현식은 별도의 변수에 할당한다.
변수는 선언부와 할당부를 나누어 호이스팅한다.
//함수 선언문
hoisted(); // 동작
function hoisted() {
console.log("호이스팅됨");
}
// 함수 표현식
notHoisted(); // 에러: 함수가 아직 정의되지 않았습니다.
var notHoisted = function () {
console.log("호이스팅되지 않음");
};
함수 선언문에서는 함수 이름이 변수에 자동으로 할당된다.
함수 표현식에서는 함수를 변수에 할당하는 것이 명시적으로 이루어진다.
// 함수 선언문
declaration(); // 동작
function declaration() {
console.log("함수 선언문");
}
// 함수 표현식
expression(); // 에러: 함수가 아직 정의되지 않았습니다.
var expression = function () {
console.log("함수 표현식");
};
함수 선언문은 함수 이름을 생략할 수 없다.
함수 표현식은 함수를 익명으로 만들 수 있다.
// 함수 선언문
function named() {
console.log("이름 있는 함수");
}
// 함수 표현식
var anonymous = function () {
console.log("익명 함수");
};
정의되자마자 즉시 실행되는 함수
function () {
console.log("IIFE");
})();
// 화살표 함수로도 사용 가능하다
(() => {
console.log("IIFE");
})();