25

I have several jQuery function like function setOne(); setTwo(); setThree();

and a variable var number that values respectively "one", "two", "three".

How can I call function "setOne()" when number values "one", function "setTwo" when number values "two" and so on...?

Thank you so much in advance. Any help will be apreciated.

1
  • 1
    Looks like normal JavaScript functions to me. Commented Dec 21, 2011 at 10:28

7 Answers 7

47

If you have your function in the global scope (on the window object) you can do:

// calls function setOne, setTwo, ... depending on number.
window["set" + number](); 

And using eval will allow you to run functions in local scope:

eval("set" + number + "()");

When is JavaScript's eval() not evil?

Sign up to request clarification or add additional context in comments.

5 Comments

Best answer, I accept this, simple and helpful and you know exactly what I mean! Thank you! If you you want you can vote my question.
this["set" + number](); would not work. Only if setX is a property of whatever this refers to, but not if setX is a local variable.
Sorry, but if number is exactly as bobighorus describes (e.g. one, two, three) then this will give an error, as setone != setOne?!
@AndreasAL Ah, thanks! ;) Then why not copy that part from my answer so we'll have it in the accepted answer too :)
Great ! Congratulations
8

Create a name -> function map:

var funcs = {
    'one': setOne,
    'two': setTwo
    /*...*/
};

Then you call the function with:

funcs[number]();

7 Comments

Actually AndreasAL's answer is the better one. People need to understand that in JavaScript everything is a dictionary and even functions are only entries on the global scope dictionary that you can access in that way.
Thanks for your answer Felix, but it seems like a switch iteration. I need an automatic solution like set+number+() that means setOne(); . I hope I was clear.
@Tigraine: It only works if the functions are global which in general is not a good idea (global namespace pollution).
@bobighorus: Well, you can also assign the functions directly to the object instead of defining them beforehand. Whether you do function setOne() {...}; or funcs['one'] = function() {...}; should not make a big difference. The advantage is that your code has a cleaner structure and is easier to understand.
@Felix Kling: You can still declare the functions on a deeper scope and use the this[] notation as AndreasAL suggested..
|
8

If the variable details the actual name of the JQuery function and you want to apply the function to a DOM element like 'body', you can do the following:

 $('body')['function-name']('params');

Comments

2

Provided your functions are in the global scope, try:

function setOne() {
  console.log('setOne called');
}
function setTwo() {
  console.log('setTwo called');
}
function setThree() {
  console.log('setThree called');
}

var number, funcName;

number = 'one';
funcName = 'set' + number.charAt(0).toUpperCase() + number.slice(1);
window[funcName](); // output: setOne called

number = 'two';
funcName = 'set' + number.charAt(0).toUpperCase() + number.slice(1);
window[funcName](); // output: setTwo called

number = 'three';
funcName = 'set' + number.charAt(0).toUpperCase() + number.slice(1);
window[funcName](); // output: setThree called

Comments

1

As simple as this is:

function hello(){
    alert("hello");
}
var str = "hello";
eval(str+"()");

2 Comments

Yeah but I have to call a function!
@bobighorus This calls the function hello()... use var str = "One"; eval("set" + str + "()"); for your example. You can even set named parameters this way... eval("set" + str + "(parameterName)");
0

Why do you have three functions for that?

var number;
function setNumber(n) {
    number = n;
}

setNumber(1) will set number to 1

setNumber(2) will set number to 2

ect

1 Comment

Thanks for yuou answer, but I think that you don't understand my question...:)
0

Further to @Andreas answer, the following illustrates the approach when not using a global.

Make a variable that holds a set of functions:

var callbacks = {
    setOne: function(params) {
        // ...
    },
    setTwo: function(params) {
        // ...
    },
};

Then if you have a variable holding the function name, you can do:

var number = "Two";
callbacks["set" + number](params);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.