Use JavaScript variable as function name?

19,735

Solution 1

Like this:

actions[key + "Dialog"] = function () { ... };

However, since Javascript functions capture variables by reference, your code will not work as intended.
You need to define the inner function inside of a separate function so that each one gets a separate key variable (or parameter).

For example:

var actionNames = [ 'create', 'update' ];   //This creates an array with two items
var Dialog = { };    //This creates an empty object

for (var i = 0; i < actionNames.length; i++) {
    Dialog[actionNames[i]] = createAction(actionNames[i]);
}

function createAction(key) {
    return function() { ... };
}

You can use it like this:

Dialog.create(...);

EDIT

You are trying to pollute the global namespace with multiple dialog-related functions.
This is a bad idea; it's better to organize your functions into namespace.

If you really want to polute the global namespace, you can do it like this:

var actionNames = [ 'create', 'update' ];   //This creates an array with two items

for (var i = 0; i < actionNames.length; i++) {
    this[actionNames[i] + 'Dialog'] = createAction(actionNames[i]);
}

This will create to global functions called createDialog and updateDialog.
In a normal function call, the this keyword refers to the global namespace (typically the window object).

Solution 2

You'll need a reference to the scope object in which you want to create the functions. If it's the global scope you can use window:

window[ actions[key] + "Dialog" ] = function(){ ... }
Share:
19,735
Alex Pliutau
Author by

Alex Pliutau

Updated on August 23, 2022

Comments

  • Alex Pliutau
    Alex Pliutau over 1 year

    I have the following code in Javascript:

    jQuery(document).ready(function(){
        var actions = new Object();
        var actions;
        actions[0] = 'create';
        actions[1] = 'update';
        for (key in actions) {
            // Dialogs
            var actions[key]+Dialog = function(){
                $('#'+actions[key]+'dialog').dialog('destroy');
                $('#'+actions[key]+'dialog').dialog({
                    resizable: false,
                    height:600,
                    width:400,
                    modal: true,
                    buttons: {
                        Cancel: function() {
                            $(this).dialog('close');
                        }
                    }
                });
            };
        }
    });
    

    I want to create 2 functions in loop(createDialog and updateDialog). How can i do this? In PHP there is very simple $$var. But how make variable variable in JS I don't know.

    Thank you