mncl
mncl

Reputation: 78

Passing arbitrary number of parameter to a function in javascript

I would like to write a javascript function that works something like this...

f([["a"]], function(e){alert(e);});
// results in alert("a");

f([["a"], ["b"]], function(e1,e2){alert(e1 + ":" + e2);});
//results in alert("a:b");

f([["a", "b"], ["c"]], function(e1,e2){alert(e1 + ":" + e2);});
//results in alert("a:c");alert("b:c");

I can think of a recursive solution for the looping, but how do I send a "unknown" number of variables to a function?

Upvotes: 3

Views: 1977

Answers (5)

bdukes
bdukes

Reputation: 155925

You can use the arguments pseudo-array available within the function to get the arguments passed in without declaring them explicitly (i,e. regardless of whether you define an argument for a function, you can access everything passed in to the function via the arguments implicit variable within that function).

Upvotes: 0

NickAldwin
NickAldwin

Reputation: 11744

According to this page, you can access any/all arguments using the arguments variable:

function f() {
    for( var i = 0; i < arguments.length; i++ ) {
         //do something with arguments[i]
    }
}

[EDIT]

Now that I understand what you're trying to do, here's a (dirty) way to do it:

Seriously, don't do it this way. It's horrible. Puppies will die.

function f(arr, fn) {
    var s = "fn(";
    for( var i = 0; i < arr.length; i++ ) {
        //you can implement your recursive code here if you like; I'm just doing the base cases
        s += arr[i];
        if(i+1 < arr.length) {
            s += ",";
        }
    }
    s += ");";
    eval(s);
}

And for a cleaner way:

function f(arr, fn) {
    fn.apply(this, arr);
}

Upvotes: 2

Jakob
Jakob

Reputation: 24360

If you put all your arguments into an array (lets call it foo), you can call a function fn with those arguments by using the apply-function.

fn.apply(null, foo)

The first argument (null in this case) is whatever you want this to be inside of the called function. null will probably work for you.

Upvotes: 3

Oded
Oded

Reputation: 499002

You can use the arguments variable that each function has to go through all the passed in arguments.

function myConcat(separator) {  
   var result = ""; // initialize list  
   // iterate through arguments  
   for (var i = 1; i < arguments.length; i++) {  
      result += arguments[i] + separator;  
   }  
   return result;  
} 

See this article for a discussion of variable number of arguments.

Upvotes: 0

Robert
Robert

Reputation: 21388

Within the function you can use the variable arguments to see what was passed. IE

function blah() {
   console.log(arguments);
}

blah(1, 2); // [1, 2]
blah([1, 2], [3]); // [[1,2], [3]]
blah(1, [2, 3], "string"); // [1, [2, 3], "string"]

Upvotes: 0

Related Questions