ES6 이전의 모든 함수는 일반 함수로서 호출할 수 있는 것은 물론 생성자 함수로서 호출할 수 있다.
foo(); // 일반적인 함수로서 호출
new foo(); // 생성자 함수로서 호출
var obj = { foo: foo };
obj.foo(); // 메서드로서 호출
ES6 사양에서 메서드는 메서드 축약 표현으로 정의된 함수만을 의미한다. 그리고 인스턴스를 생성할 수 없는 non-constructor다.
=>, fat arrow
화살표 함수는 함수 선언문으로 정의할 수 없고 함수 표현식으로 정의해야 한다.
const multiply = (x, y) => x * y;
multiply(2, 3); // 6
함수 몸체가 하나의 문으로 구성된다면 중괄호 {}를 생략할 수 있다.
함수 몸체 내부 문이 값으로 평가될 수 있는 표현식인 문이라면 암묵적으로 반환된다.
const power = x => x ** 2;
power(2);
const power = z => { return x ** 2 }; // block body
객체 리터럴을 반환하는 경우 객체 리터럴을 소괄호 () 로 감싸 주어야 한다.
const create = (id, content) => ({id, content})
===
const create = (id, content) => { return { id, content }; };
const Foo = () => {};
new Foo(); // TypeError
Foo.hasOwnProperty('prototype'); // false
일반 함수는 중복된 매개변수 이름을 선언해도 에러가 발생하지 않는다.
단 strict mode에서는 에러가 발생한다.
화살표 함수에서는 중복된 매개변수 이름을 선언하면 에러가 발생한다.
const arrow = (a,a) => a + a; // SyntaxError
화살표 함수는 함수 자체의 this 바인딩을 갖지 않는다. 따라서 화살표 함수 내부에서 this를 참조하면 상위 스코프의 this를 그대로 참조한다. 이를 lexical this라고 한다.
잘 읽었습니다. 좋은 정보 감사드립니다.