Front-end/JavaScript

JS 동작원리 7편 - V8 Optimization killer (arguments)

파리외 개발자 2022. 11. 26. 11:59

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는 인자에 접근을 할 수 있지만 동일한 기능이 가능한 나머지 인자에 비해 부족한 부분이 많다.

  1. 호이스팅에 유리한 함수 표현식에서의 사용이 불가능한 점이나
  2. 배열 내장함수를 사용하기 위해서는 변환이 필요하다는 점,
  3. 이미 정의된 함수의 인자까지 포함한다는 점이 그렇다.

거기에 가장 큰 이유는 V8엔진에서 최적화를 해주지 못한다는 것이다.

여기에 대해 자세히 작성하고 싶었지만 V8엔진을 까서 증명까지 하기엔 얻는거에 비해 시간이 너무 들어간다고 판단하여 나중으로 미루게 되었다. 대신 관련자료를 링크하겠으니 관심이 더 생기면 참고해보길 바란다.

Bluebird git Wiki 페이지

위 페이지를 한글로 번역정리된 블로그 글

사실 V8에서 최적화를 지원하지 않는다고 하고 나머지 인자방식이 훨씬 편리한 게 사실이니 굳이 arguments하나가 최적화 되지 않는 이유까지 상세하게 알 필요가 있을까 싶다.