Antworten:
const args = ['p0', 'p1', 'p2'];
call_me.apply(this, args);
Siehe MDN-Dokumente für Function.prototype.apply()
.
Wenn die Umgebung ECMAScript 6 unterstützt, können Sie stattdessen ein Spread-Argument verwenden:
call_me(...args);
Warum übergeben Sie nicht das gesamte Array und verarbeiten es nach Bedarf innerhalb der Funktion?
var x = [ 'p0', 'p1', 'p2' ];
call_me(x);
function call_me(params) {
for (i=0; i<params.length; i++) {
alert(params[i])
}
}
call_me
Funktion. Am Ende fehlt nur ein Semikolon.
Im ES6-Standard gibt es einen neuen Spread-Operator, ...
der genau das tut.
call_me(...x)
Es wird von allen gängigen Browsern außer IE unterstützt.
Der Spread-Operator kann viele andere nützliche Dinge tun, und die verknüpfte Dokumentation zeigt dies wirklich gut.
Da hatte @KaptajnKold geantwortet
var x = [ 'p0', 'p1', 'p2' ];
call_me.apply(this, x);
Außerdem müssen Sie nicht alle Parameter für die Funktion call_me definieren. Sie können einfach verwendenarguments
function call_me () {
// arguments is a array consisting of params.
// arguments[0] == 'p0',
// arguments[1] == 'p1',
// arguments[2] == 'p2'
}
Beachten Sie dies
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-Seite
<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>
kann die Funktion mit beliebigen Args aufrufen
<body onmousemove="FollowMouse(d1,d2)">
oder
<body onmousemove="FollowMouse(d1)">
function foo([a,b,c], d){
console.log(a,b,c,d);
}
foo([1,2,3], 4)
function foo(a, b, c, d){
console.log(a, b, c, d);
}
foo(...[1, 2, 3], 4)
Bei Verwendung des Spread-Operators müssen wir beachten, dass dies der letzte oder einzige übergebene Parameter sein muss. Sonst wird es scheitern.
function callMe(...arr){ //valid arguments
alert(arr);
}
function callMe(name, ...arr){ //valid arguments
alert(arr);
}
function callMe(...arr, name){ //invalid arguments
alert(arr);
}
Wenn Sie ein Array als Startargument übergeben müssen, können Sie Folgendes tun:
function callMe(arr, name){
let newArr = [...arr];
alert(newArr);
}
Sie können den Spread-Operator in einer grundlegenderen Form verwenden
[].concat(...array)
im Fall von Funktionen, die Arrays zurückgeben, von denen jedoch erwartet wird, dass sie als Argumente übergeben werden
Beispiel:
function expectArguments(...args){
return [].concat(...args);
}
JSON.stringify(expectArguments(1,2,3)) === JSON.stringify(expectArguments([1,2,3]))
Die Antwort wurde bereits gegeben, aber ich möchte nur mein Stück Kuchen geben. Was Sie erreichen möchten, wird method borrowing
im Kontext von JS aufgerufen, dh wenn wir eine Methode aus einem Objekt nehmen und sie im Kontext eines anderen Objekts aufrufen. Es ist durchaus üblich, Array-Methoden zu verwenden und sie auf Argumente anzuwenden. Lassen Sie mich Ihnen ein Beispiel geben.
Wir haben also eine "super" -Hashing-Funktion, die zwei Zahlen als Argument verwendet und eine "super sichere" Hash-Zeichenfolge zurückgibt:
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
So weit so gut, aber wir haben wenig Probleme mit dem obigen Ansatz, es ist eingeschränkt, funktioniert nur mit zwei Zahlen, das ist nicht dynamisch, lassen Sie es mit einer beliebigen Zahl funktionieren und außerdem müssen Sie kein Array übergeben (Sie können wenn Sie immer noch darauf bestehen). Ok, genug geredet, lass uns kämpfen!
Die natürliche Lösung wäre die Verwendung der folgenden arr.join
Methode:
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
Oh Mann. Das wird leider nicht funktionieren. Da wir Hash (Argumente) und Argumente aufrufen, ist das Objekt sowohl iterierbar als auch Array-ähnlich, aber kein echtes Array. Wie wäre es mit dem folgenden Ansatz?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
Der Trick heißt method borrowing.
Wir leihen eine join
Methode aus einem regulären Array aus [].join.
und verwenden sie [].join.call
, um sie im Kontext von auszuführen arguments
.
Warum funktioniert es?
Das liegt daran, dass der interne Algorithmus der nativen Methode arr.join(glue)
sehr einfach ist.
Entnommen aus der Spezifikation fast "wie sie ist":
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.
Technisch gesehen nimmt es dies und verbindet dieses [0], dieses [1] ... usw. miteinander. Es ist absichtlich so geschrieben, dass es jedes Array-ähnliche zulässt (kein Zufall, viele Methoden folgen dieser Praxis). Deshalb funktioniert es auch mitthis=arguments.