2017. 6. 25. 21:25ㆍDev/javascript
http://www.jaeminjo.com/post/107109578789/arrayprototypeslicecallarguments
위의 링크에 친절한 설명이 나와 있지만 부가 설명을 해본다.
이것을 이해하기 위해서는 call(), arguments를 이해해야 한다.
call()은 상위 context를 변경하는 메서드이고
arguments는 함수의 매개변수에 접근할 수 있는 속성이다.
먼저 위의 행위를 말로 설명하자면
이 코드가 존재하는 함수의 매개변수로 넘어온 값들을 array로 변환하겠다는 것이다.
function func(a, b){} 에서 a와 b를 arguments[0]과 arguments[1]로 접근가능하다.
하지만 여기서 arguments는 array가 아니며 object임을 알아야 한다.(참고) 그러므로 array로 변환할 필요가 있을 경우 Array.prototype.slice.call(arguments) 를 사용하는 것이다.
이 코드는 보통 아래와 같이 apply와 함께 사용된다.
var args = Array.prototype.slice.call(arguments);
func.apply(this, args);
apply는 call과 같이 상위 context를 변경해준다. 차이점은 매개변수를 넘겨주는 2번째 인자가 Array라는 점이다. Array에 담긴 순서에 맞게 호출된 함수(func)의 매개변수에 적용된다.
Array.prototype.slice.call(arguments);
이 코드는 결과만 보면 아래와 같다.
[arguments].slice();
call()의 첫번째 인자에 arguments가 전달되므로 Array의 context는 arguments로 대체되기 때문이다.
추가로 ES6에서는 Array.from()으로 제공한다(참고)
결론
결국 이러한 행위는 문법적 꼼수라고 할 수 있다.
v8엔진에서 최적화 문제도 있다고 하니 다음 코드를 사용해보는 것도 좋다.
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
'Dev > javascript' 카테고리의 다른 글
자바스크립트 성능과 사용자 경험 개선 (0) | 2017.07.16 |
---|---|
브라우저의 단일스레드와 repaint, reflow (0) | 2017.07.16 |
패턴 (0) | 2017.06.04 |
자바스크립트 객체 (0) | 2017.01.19 |
자바스크립트 도구 다루기 (0) | 2017.01.19 |