ES6 호환코드에서는 arguments 보다는 나머지 인자를 사용하세요
arguments와 ...args(나머지 인자)는 함수의 인자에 접근할 수 있다.
arguments
- arguments는 함수의 인자로 전달받은 person1, person2를 배열의 형태로 전달받는다.
- 첫줄 결과에서 보듯이 arguments는 배열이 아닌 Arguments객체이다.
- 따라서 배열처럼 사용하고 싶다면 Array.from()을 사용해 변환이 필요하다.
...args
- 나머지인자는 arguments처럼 array변환이 필요없이 배열의 형태로 인자를 전달받는다.
arguments와 ...args는 함수선언에서 명시된 인수의 갯수에 상관없이 받을 수 있다.
arguments
- 명시된 인자는 두개지만 호출 시 네개의 인자를 넣어 호출해도 arguments를 통해 접근할 수 있다.
...args
- 나머지 인자는 명시된 인자 이외의 모든 인자를 배열로 저장한다.
- ...(나머지 인수배열 이름)은 항상 마지막에 위치해야 한다.
arguments는 함수 표현식에서는 사용이 불가능하다.
- arguments는 함수표현식에서는 정의되지 않고 함수선언식에서만 사용가능하다.
arguments는 V8엔진이 최적화를 지원하지 않는다.
arguments는 인자에 접근을 할 수 있지만 동일한 기능이 가능한 나머지 인자에 비해 부족한 부분이 많다.
- 호이스팅에 유리한 함수 표현식에서의 사용이 불가능한 점이나
- 배열 내장함수를 사용하기 위해서는 변환이 필요하다는 점,
- 이미 정의된 함수의 인자까지 포함한다는 점이 그렇다.
거기에 가장 큰 이유는 V8엔진에서 최적화를 해주지 못한다는 것이다.
여기에 대해 자세히 작성하고 싶었지만 V8엔진을 까서 증명까지 하기엔 얻는거에 비해 시간이 너무 들어간다고 판단하여 나중으로 미루게 되었다. 대신 관련자료를 링크하겠으니 관심이 더 생기면 참고해보길 바란다.
사실 V8에서 최적화를 지원하지 않는다고 하고 나머지 인자방식이 훨씬 편리한 게 사실이니 굳이 arguments하나가 최적화 되지 않는 이유까지 상세하게 알 필요가 있을까 싶다.
'Front-end > JavaScript' 카테고리의 다른 글
JS 동작원리 9편 - Scope(lexical & dynamic)와 this (0) | 2022.12.19 |
---|---|
JS 동작원리 8편 - 실행 컨텍스트(VE, scope chain, this) (1) | 2022.12.11 |
JS 동작원리 6편 - 호이스팅 (0) | 2022.11.06 |
JS 동작원리 5편 - 런타임 (Event Loop, Callback Queue, 비동기) (0) | 2022.11.03 |
JS 동작원리 4편 - 콜 스택 (0) | 2022.11.03 |