我在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中创建变量变量我不知道。
谢谢
答案 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]);
}
这将创建名为createDialog
和updateDialog
的全局函数
在正常的函数调用中,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更小更清晰。