ES6 이전, 모든 함수는 다양한 함수 형태로 호출가능 : 일반적 함수, 생성자 ,메서드 ( callable, constructor → 호출 할수 있고, 인스턴스 생성할수있는 함수 객체 )
메서드라 불리던 객체에 바인딩된 함수도 callable, constructor라서, 일반 함수로서 호출되고, 생성자 함수로서 호출 가능
→ 바인딩된 함수가 prototype 프로퍼티 갖고, 프로토타입 객체 생성함을 의미함
→ 단점,보조 함수인 콜백도 constructor라 불필요한 프로토 타입 객체 생성
es6에서 메서드는, 메서드 축약표현으로 정의된 함수로 인스턴스 생성불가, prototype 프로퍼티 없고 프로토타입도 생성하지 않음
→ 표준빌드인 객체가 제공하는 프로토타입 메서드, 정적 메서드 모두 non-constructor임
foo(){return this,x} 이런식..
자신을 바인딩한 객체를 가리키는 내부 슬롯 [[HomeObject]]를 갖는다. → super 갖음 HomeObject으로 수퍼 클레스 참조하니까
내부동작도 간단함. 콜백함수 내부에서 this가 전역 객체 가리키는 문제 해결위한 대안으로 유용함.
함수 몸체가 하나의 문으로 구성되면 {} 생략가능
const power = x => x**2;
위 아래 같은 것
const power = x => {return x**2};
객체 리터럴 반환시 () 로 묶기
const create = (id, content) => ({id, content});
const create = (id, content) => (return {id, content});
화살표 함수도 즉시 실행 함수로 사용가능 (전체 ()로 감싸고, 맨뒤에 ()를 붙여서)
특징
non-constructor 화살표함수는 인스턴스 생성 할수 없음
중복된 매개변수 이름 선언불가.
function normal(a,a) {return a+a;} <<- use strict 빼고 가능
const arrow = (a,a) => a+a; <<- 불가능
화살표 함수 자체의 this, agruments, super, new.target 바인딩 갖지 않음
함수 내, this, arguments, super.. 참조시 스코프 체인 통해 상위 스코프 this, arguments. 참조
this는 원래 함수내 전역 객체함수 가르키나, 함수항상 strict mode이고 이때 this는, undefined가 바인딩됨. 기존에는 this를 that에 임시로 저장하거나, bind메서드를 사용하거나, 콜백함수 내 this로 사용할 객체 전달함
ES6부터는 화살표 함수로 해결가능. → 화살표 함수는 함수 자체 this 바인딩이 없고, 상위 스코프인 this를 그대로 참조(lexicla this) → 렉시컬 스코프처럼 화살표 함수의 this가 정의된 위치에 의해 결정됨
화살표 함수는 this바인딩 없어서 call, apply , bind메서드 사용해도 this 교체 불가능 하지만 참조하는 상위 스코프에 call appy bind 되어잇으면 참조 가능
메서드, 프로토타입 객체 할당시 선언시 화살표 함수쓰면안됨 this가 상위 스코프 가르켜서
화살표함수는 자체의 super 바인딩을 갖지 않는다. 따라서 화살표 함수 내부에서 super 참조하면 this와 마찬가지로 상위 스코프 super 참조
화살표 함수는 함수 자체의 arguments 바인딩 갖지 않음. 상위 스코프 참조
arguments객체는 함수 정의할떄 매개변수 개수 확정할수 없는 가변인자 함수 구할떄 유용하나 화살표함수에서는 Rest 파라미터 사용해야함
Rest 파라미터는 함수에 전달된 인수들의 목록 배열로 전달 받음
es5 에서는 arugments 객체로 인수 전달 받음 (유사 배열 객체 → 배열 메서드 사용하려면 Function.prototype.call Function.prototype.apply 를 사용해 Functiond 함수 이름임 배열로 변환해야함 )
함수, Es6메서드는 Rest 파라미터, arguments 객체 모두 사용 가능 하나 화살표 함수 자체의 arguments 객체 갖지 않음. 화살표 함수로 가변 인자 함수 구현시, Rest 파라미터 사용해야함
js는 매개변수 개수, 인수 개수 체크하지 않아서 개수가 달라도 에러는 안나나 의도치 않은 결과 발생함
매개변수 기본값을 해주면 값 예측 가능 ..이때, 인수 전달하지 않은경우, undefined 전달한 경우만 유효하고, length 와 argument에 영향주지 않음
rest 파라미터는 기본값지정 불가능