Use JavaScript variable as function name?

前端 未结 5 1026
抹茶落季
抹茶落季 2020-12-02 00:23

I have the following code in Javascript:

jQuery(document).ready(function(){
    var actions = new Object();
    var actions;
    actions[0] = \'create\';
            


        
相关标签:
5条回答
  • 2020-12-02 00:35

    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).

    0 讨论(0)
  • 2020-12-02 00:41

    I think you're trying to do something that you don't need to do in JavaScript. In PHP, function passing is a bit of a kludge. In JavaScript it is elegant and painless.

    How are you planning on calling these functions later? I'm guessing that you have these function names hard-coded into your HTML in the 'onclick' attributes. Hard-coding JavaScript into your HTML via the on* attributes is a bad idea. If that's what you're doing, you have to create variables in the global scope (another practice best avoided). In the browser, the global object is window. If you define a property on window, the function will be available globally:

    $(document).ready(function() {
      var myNames = [
        'create',
        'destroy'
      ];
      for (var i = 0; i < myNames.length; i++) {
        window[myNames[i] + 'Dialog'] = function() {
          alert('Hello');
        };
      }
    });
    

    This assumes that you have onclick attributes in your HTML that match up with the function names you're creating.

    A better way to do this would be to just create the functions as you bind them to the events, never even assigning them to variables:

    $(document).ready(function() {
      $('#createdialog, #destroydialog').each(function() {
        $(this).click(function() {
          alert('Hello');
        });
      });
    });
    

    This will make both your JavaScript and your HTML smaller and cleaner.

    0 讨论(0)
  • 2020-12-02 00:47

    You need to combine SLaks' and RoToRa's answers:

    var actionNames = [ 'create', 'update' ];   //This creates an array with two items
    
    for (var i = 0; i < actionNames.length; i++) {
        window[ actionNames[i] + 'Dialog' ] = function() {
            $('#'+ actionNames[i] +'dialog').dialog('destroy');
            $('#'+ actionNames[i] +'dialog').dialog({
                resizable: false,
                height:600,
                width:400,
                modal: true,
                buttons: {
                    Cancel: function() {
                        $(this).dialog('close');
                    }
                }
            });
        }
    }
    

    Since you're running this in the document ready event handler, the "this" variable would refer to the document, not the window.

    0 讨论(0)
  • 2020-12-02 00:57

    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(){ ... }
    
    0 讨论(0)
  • 2020-12-02 00:59

    javascript global scope is window, so you can write:

    var funcName='varfuncname';
        window[funcName]=function() {
        alert('HI!');
    }
    

    Now you can call it as window[funcName]();, window['varfuncname'](); or varfuncname();

    0 讨论(0)
提交回复
热议问题