Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript: "Infinite" parameters for function?

In Chrome, when I type console.log in the one below:

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

...it prints it correctly, with no errors or warnings. I appended more parameters, but it still prints it out correctly.

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

How can I have an "infinite" parameter function just like that one?

like image 765
auroranil Avatar asked Feb 18 '12 03:02

auroranil


People also ask

Can a function take unlimited arguments?

We pass arguments in a function, we can pass no arguments at all, single arguments or multiple arguments to a function and can call the function multiple times.

How many parameters can a function have JavaScript?

When you call a function in JavaScript, you can pass in any number of arguments, regardless of what the function declaration specifies. There is no function parameter limit.

What happens if you pass an extra parameter to a method in JavaScript?

Unless otherwise specified in the description of a particular function, if a function or constructor described in this clause is given more arguments than the function is specified to allow, the extra arguments are evaluated by the call and then ignored by the function.

What is function () () in JavaScript?

A function in JavaScript is similar to a procedure—a set of statements that performs a task or calculates a value, but for a procedure to qualify as a function, it should take some input and return an output where there is some obvious relationship between the input and the output.


1 Answers

Functions can access an array-like object called arguments that contains all the arguments that they received

function print_my_arguments(/**/){     var args = arguments;     for(var i=0; i<args.length; i++){         console.log(args[i]);     } }; 

And you can do the opposite conversion (call a function given a list of arguments) with the apply method:

// These are equivalent: print_my_arguments(1,2,3); print_my_arguments.apply(null, [1,2,3]);  // The first parameter to `apply` is the `this`. // It is used when the function is a method. foo.bar(1,2,3); var f = foo.bar; f.apply(foo, [1,2,3]); 

Some important points to note:

  1. arguments isn't an actual array and it has none of the usual array methods (slice, join, etc). You can convert it to an array with the following line:

    var args = Array.prototype.slice.call(arguments); 
  2. Slice is also useful if you want your array to only contain the non-named arguments that were received:

    function foo(first_arg, second_arg /**/){     var variadic_args = Array.prototype.slice.call(arguments, 2); } 
  3. Not every browser can handle an arbitrarily large number of function parameters. Last time I tested this, in Chrome and IE there was a stackoverflow after some 200.000 arguments. If your function can receive an arbitrarily large number of arguments, consider packing all of those arguments in an regular array instead.

  4. Those /**/ comments that appear in the arguments lists for my examples are not mandatory. They are just a coding a convention that I use to mark my variadic functions and differentiate them from regular functions.

    // A quick glance would suggest that this function receives no // parameters but actually it is a variadic function that gets // its parameters via the `arguments` object. function foo(){     console.log(arguments.length); } 
like image 89
hugomg Avatar answered Sep 18 '22 12:09

hugomg