답변:
const args = ['p0', 'p1', 'p2'];
call_me.apply(this, args);
에 대한 MDN 문서를 참조하십시오 Function.prototype.apply()
.
환경이 ECMAScript 6을 지원하는 경우 스프레드 인수를 대신 사용할 수 있습니다 .
call_me(...args);
왜 전체 배열을 전달하고 함수 내에서 필요에 따라 처리하지 않습니까?
var x = [ 'p0', 'p1', 'p2' ];
call_me(x);
function call_me(params) {
for (i=0; i<params.length; i++) {
alert(params[i])
}
}
call_me
함수를 호출 합니다. 끝에 세미콜론이 부족합니다.
ES6 표준에는 정확하게이를 수행 하는 새로운 스프레드 연산자 ...
가 있습니다.
call_me(...x)
IE를 제외한 모든 주요 브라우저에서 지원됩니다.
스프레드 연산자는 다른 많은 유용한 작업을 수행 할 수 있으며 링크 된 문서는이를 잘 보여줍니다.
@KaptajnKold가 대답했듯이
var x = [ 'p0', 'p1', 'p2' ];
call_me.apply(this, x);
또한 call_me 함수에 대한 모든 매개 변수를 정의 할 필요는 없습니다. 당신은 그냥 사용할 수 있습니다arguments
function call_me () {
// arguments is a array consisting of params.
// arguments[0] == 'p0',
// arguments[1] == 'p1',
// arguments[2] == 'p2'
}
이것에 주목
function FollowMouse() {
for(var i=0; i< arguments.length; i++) {
arguments[i].style.top = event.clientY+"px";
arguments[i].style.left = event.clientX+"px";
}
};
// ---------------------------
html 페이지
<body onmousemove="FollowMouse(d1,d2,d3)">
<p><div id="d1" style="position: absolute;">Follow1</div></p>
<div id="d2" style="position: absolute;"><p>Follow2</p></div>
<div id="d3" style="position: absolute;"><p>Follow3</p></div>
</body>
Args로 함수 호출 가능
<body onmousemove="FollowMouse(d1,d2)">
또는
<body onmousemove="FollowMouse(d1)">
스프레드 연산자를 사용하는 동안 전달 된 마지막 또는 유일한 매개 변수 여야합니다. 그렇지 않으면 실패합니다.
function callMe(...arr){ //valid arguments
alert(arr);
}
function callMe(name, ...arr){ //valid arguments
alert(arr);
}
function callMe(...arr, name){ //invalid arguments
alert(arr);
}
배열을 시작 인수로 전달해야 할 경우 다음을 수행 할 수 있습니다.
function callMe(arr, name){
let newArr = [...arr];
alert(newArr);
}
답은 이미 주어졌지만 케이크 한 조각 만주고 싶습니다. 달성하고자하는 것을method borrowing
JS의 맥락에서 됩니다. 우리는 객체에서 메소드를 가져 와서 다른 객체의 컨텍스트에서 호출합니다. 배열 메소드를 사용하여 인수에 적용하는 것이 일반적입니다. 예를 들어 보겠습니다.
그래서 우리는 두 개의 숫자를 인자로 받아서 "super safe"해시 된 문자열을 반환하는 "super"해싱 함수를 가지고 있습니다 :
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
지금까지는 좋았지 만 위의 접근 방식에는 거의 문제가 없습니다. 제약되고 두 숫자로만 작동합니다. 동적하지 않습니다. 어떤 숫자로도 작동하게하고 배열을 전달할 필요가 없습니다 (당신은 할 수 있습니다) 여전히 고집한다면). 알았어, 충분히 말해봐, 싸워 보자!
자연스러운 해결책은 arr.join
방법 을 사용 하는 것입니다.
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
오. 불행히도, 그것은 작동하지 않습니다. 우리는 hash (arguments)를 호출하고 arguments 객체는 반복 가능하고 배열과 비슷하지만 실제 배열은 아닙니다. 아래 접근 방식은 어떻습니까?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
트릭은 method borrowing.
우리 join
는 일반 배열에서 메소드를 빌려서 컨텍스트에서 실행하는 데 [].join.
사용 [].join.call
합니다 arguments
.
왜 작동합니까?
기본 메소드의 내부 알고리즘 때문입니다. arr.join(glue)
이 매우 단순하기 때문입니다.
거의 "있는 그대로"사양에서 가져옵니다.
Let glue be the first argument or, if no arguments, then a comma ",".
Let result be an empty string.
Append this[0] to result.
Append glue and this[1].
Append glue and this[2].
…Do so until this.length items are glued.
Return result.
따라서 기술적으로는 이것을 취해 이것 [0], 이것 [1]… 등을 합칩니다. 그것은 배열과 같은 것을 허용하는 방식으로 의도적으로 작성되었습니다 (우연의 일치가 아니라 많은 방법 이이 연습을 따릅니다). 그것이 함께 작동하는 이유입니다this=arguments.