Function.prototype.apply(thisArg, [argsArray])
모든 함수는 apply메소드를 상속받으며 함수에 배열의 원소들이 나열되어 전달되면서 함수를 호출한다.
thisArg는 함수를 호출하는 객체가 되고 argsArray는 배열이어야 하며 함수에 전달되는 인자가 된다.
var arr = [1,2];
var addArr = [3,4];
Array.prototype.push.apply(arr, addArr);
Array.prototype.push(element1[, ...[, elementN]])
arr.push(addArr);은 Array.prototype.push메소드를 불러와 사용하는 것이며 원소들을 나열해서 전달해야 하는 함수인데
arr.push(addArr);와 같이 배열을 전달하면 배열이 하나의 원소로 추가되는 문제가 발생한다.
이럴때 apply메소드를 사용하면 된다.
arr.push.apply(this, addArr);
arr.push.apply(null, addArr);
arr.push.apply(arr, addArr);
위 3가지 중 어떤 것이 맞을까?
첫번째 인자는 내부 this를 바인딩하는 것으로 null을 하면 안될것이고 this는 현재 코드블럭에서는 window를 참조하므로 사용하면 안된다.
3번째 호출방법만 남았으며 이렇게 해야 제대로 수행된다.
arr.push.apply(arr, addArr);은 Array.prototype.push.apply(arr,addArr);와 같은 것이다.
앞에 arr이 있다고해서 arr의 메소드를 호출하므로 arr.push(addArr);과 같이 처리될것으로 예상하면 잘못된 것이다.
apply메소드는 컨텍스트정보가 없는 메소드만 접근하여 this객체를 바인딩할 인자와 전달한 인자인자를 사용하면 되는 메소드다.
const numbers = [5, 6, 2, 3, 7];
console.log( Math.max.apply(null, numbers) );
Math.max메소드는 함수내부에 this가 없기때문에 null로 바인딩해도 상관없는 것이다.