I\'d like to call a function using an array as parameters:
const x = [\'p0\', \'p1\', \'p2\'];
call_me(x[0], x[1], x[2]); // I don\'t like it
function call_me (param0, param1, param2 ) {
// ...
}
Is there a better way of passing the contents of x
into call_me()
?
const args = [\'p0\', \'p1\', \'p2\'];
call_me.apply(this, args);
See MDN docs for Function.prototype.apply()
.
If the environment supports ECMAScript 6, you can use a spread argument instead:
call_me(...args);
Why don\'t you pass the entire array and process it as needed inside the function?
var x = [ \'p0\', \'p1\', \'p2\' ];
call_me(x);
function call_me(params) {
for (i=0; i<params.length; i++) {
alert(params[i])
}
}
Assuming that call_me is a global function, so you don\'t expect this to be set.
var x = [\'p0\', \'p1\', \'p2\'];
call_me.apply(null, x);
In ES6 standard there is a new spread operator ...
which does exactly that.
call_me(...x)
It is supported by all major browsers except for IE.
The spread operator can do many other useful things, and the linked documentation does a really good job at showing that.
As @KaptajnKold had answered
var x = [ \'p0\', \'p1\', \'p2\' ];
call_me.apply(this, x);
And you don\'t need to define every parameters for call_me function either.
You can just use arguments
function call_me () {
// arguments is a array consisting of params.
// arguments[0] == \'p0\',
// arguments[1] == \'p1\',
// arguments[2] == \'p2\'
}
Note this
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 page
<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>
can call function with any Args
<body onmousemove=\"FollowMouse(d1,d2)\">
or
<body onmousemove=\"FollowMouse(d1)\">
The answer was already given, but I just want to give my piece of cake. What you want to achieve is called method borrowing
in the context of JS, that when we take a method from an object and call it in the context of another object. It is quite common to take array methods and apply them to arguments. Let me give you an example.
So we have \"super\" hashing function which takes two numbers as an argument and returns \"super safe\" hashed string:
function hash() {
return arguments[0]+\',\'+arguments[1];
}
hash(1,2); // \"1,2\" whoaa
So far so good, but we have little problem with the above approach, it is constrained, only works with two numbers, that is not dynamic, let\'s make it work with any number and plus you do not have to pass an array (you can if you still insist). Ok, Enough talk, Let\'s fight!
The natural solution would be to use arr.join
method:
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
Oh, man. Unfortunately, that won’t work. Because we are calling hash(arguments) and arguments object is both iterable and array-like, but not a real array. How about the below approach?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // \"1,2,3,4\" whoaa
The trick is called method borrowing.
We borrow a join
method from a regular array [].join.
And use [].join.call
to run it in the context of arguments
.
Why does it work?
That’s because the internal algorithm of the native method arr.join(glue)
is very simple.
Taken from the specification almost “as-is”:
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.
So, technically it takes this and joins this[0], this[1] …etc together. It’s intentionally written in a way that allows any array-like this (not a coincidence, many methods follow this practice). That’s why it also works with this=arguments.
1-you can join the array into an string
2-pass it to function
3-call split
var fruits = [\"Banana\", \"Orange\", \"Apple\", \"Mango\"];
function myFunction(name)
{
var nameArray = name.split(\',\');
.
.
.
}
call method:
myFunction(fruits.join(\',\'));
or even
myFunction(\"orange,Apple,fruits\");