使用JavaScript变量作为函数名?

时间:2010-09-01 14:21:01

标签: javascript variables function

我在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');
                    }
                }
            });
        };
    }
});

我想在循环中创建2个函数(createDialog和updateDialog)。我怎样才能做到这一点?在PHP中有非常简单的$$ var。但是如何在JS中创建变量变量我不知道。

谢谢

5 个答案:

答案 0 :(得分:6)

像这样:

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

但是,由于Javascript函数通过引用捕获变量,因此您的代码将无法正常工作 您需要在单独的函数内部定义内部函数,以便每个函数都获得一个单独的key变量(或参数)。

例如:

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() { ... };
}

你可以像这样使用它:

Dialog.create(...);

修改

您正尝试使用多个与对话框相关的功能来污染全局命名空间 这是一个坏主意;将函数组织到命名空间中会更好。

如果你真的想要对全局命名空间进行规范,你可以这样做:

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]);
}

这将创建名为createDialogupdateDialog的全局函数 在正常的函数调用中,this关键字引用全局命名空间(通常是window对象)。

答案 1 :(得分:2)

您需要对要在其中创建函数的范围对象的引用。如果它是全局范围,您可以使用window

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

答案 2 :(得分:0)

javascript全局范围是窗口,所以你可以写:

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

现在您可以将其称为window[funcName]();window['varfuncname']();varfuncname();

答案 3 :(得分:0)

你需要结合SLaks和RoToRa的答案:

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');
                }
            }
        });
    }
}

由于您在文档就绪事件处理程序中运行它,因此“this”变量将引用文档,而不是窗口。

答案 4 :(得分:0)

我认为你正在尝试做一些你不需要在JavaScript中做的事情。在PHP中,函数传递有点像kludge。在JavaScript中它优雅而无痛。

您打算如何在以后调用这些功能?我猜你在'onclick'属性中将这些函数名称硬编码到你的HTML中。 通过on*属性将JavaScript硬编码到HTML中是一个坏主意。如果这就是您正在做的事情,您必须在全局范围内创建变量(另一种做法最好避免) 。在浏览器中,全局对象为window。如果您在window上定义属性,则该函数将全局可用:

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

这假设您的HTML中有onclick个属性与您正在创建的函数名称相匹配。

更好的方法是在将事件绑定到事件时创建函数,甚至不将它们分配给变量:

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

这将使您的JavaScript和HTML更小更清晰。