Javascript 调用由参数在变量中声明的函数
我希望能够运行在变量“Table”中声明的函数。 原因是为了避免使用基于字符串的解析来运行函数Javascript 调用由参数在变量中声明的函数,javascript,Javascript,我希望能够运行在变量“Table”中声明的函数。 原因是为了避免使用基于字符串的解析来运行函数 var Table = function( params ){ var rowTemplate = params.rowTemplate; var table = params.table; function GetRow() { return $( r
var Table = function( params ){
var rowTemplate = params.rowTemplate;
var table = params.table;
function GetRow()
{
return $( rowTemplate ).html();
}
function AddRow()
{
$( table ).append( GetRow() );
}
function BindEvents()
{
for( a in params.bind )
{
params.bind[ a ].action();
}
}
function Construct()
{
BindEvents();
}
Construct();
return {
AddRow: function() { AddRow(); }
}
};
var ProductsTable = new Table( {
table: "#ProductsTable tbody",
rowTemplate: "#ProductsTable_TemplateRow",
bind: [
{ action: AddRow, element: "#productsAddRowButton" }
]
} );
您可以看到我的ProductsTable将一个对象传递到我的构造中,该对象具有一个名为“bind”的属性,该属性是一个动作数组和实例化动作的元素
AddRow显然还没有声明。所以它抛出了一个错误。我不想做的是传入一个字符串“AddRow”,因为这样我将解析一个字符串。。。然后在表范围内运行函数,这很难看
有什么解决办法吗
这是我的解决方案,多亏了“不,它不可能完成”的回答,这让我走上了switch语句的轨道:(…:):
我不认为可以绕过将函数名作为字符串传递,因为在创建对象之前,实际函数不存在 即使将它们作为字符串传递,由于作用域的限制,似乎也存在问题。所以我会这样做:
var Table = function( params ){
var rowTemplate = params.rowTemplate;
var table = params.table;
// add any additional functions to this object
var functions = {
AddRow: function() {
$( table ).append( GetRow() );
}
};
function GetRow()
{
return $( rowTemplate ).html();
}
function BindEvents()
{
for(var a in params.bind )
{
var action = params.bind[a].action;
if (functions.hasOwnProperty(action)) {
functions[action]();
}
}
}
BindEvents();
};
var ProductsTable = new Table({
table: "#ProductsTable tbody",
rowTemplate: "#ProductsTable_TemplateRow",
bind: [
{ action: "AddRow", element: "#productsAddRowButton" }
]
});
以字符串形式传递函数名在JavaScript中非常常用,所以我不担心这样做
示例-这是一个无中生有的想法,但我猜您的实际代码不会从构造函数同步调用
bind
操作。如果它们绑定到事件,则可以简单地使用闭包来描述尚未创建的方法:
var ProductsTable = new Table({
table: "#ProductsTable tbody",
rowTemplate: "#ProductsTable_TemplateRow",
bind: [
{
action: function() {
ProductsTable.AddRow();
},
element: "#productsAddRowButton"
}
]
});
哇,这是很多不必要的函数声明…只是内联它们!我不明白bindEvents应该做什么。它只执行给定函数的集合,但没有任何附加上下文-它与
表
有什么关系?您可以传递一个空数组,然后简单地执行ProductsTable.AddRow()
。在表的作用域中声明要绑定的函数实现了什么?如果它们是在外部声明的,您就可以绑定它们。这不是全部代码:)这是试图将一些层分离出来。很难量化原因,但这是个好主意阅读“企业应用程序架构模式”我不想做的是传入一个字符串“AddRow”,因为这样我将解析一个字符串。。。然后要从表范围内运行函数,这很难看
——这很难看?范围很好,我有一个AddRow重载,公开和私下声明到变量范围。但是,是的,如果你说我不能传递一个裁判给它(这是绝对有意义的),那么我将对那个坏男孩做一个开关。。我甚至可以提供一些位标志/掩码,这会使代码更整洁!AddRow的重载实际上可以很好地公开访问它!因此,定义了click事件的my button运行AddRow的私有版本。。但是我也可以使用我的公共函数来运行AddRow!如果我想以编程方式调用它,而不是基于事件。切斯特冻糕。如果我用this.AddRow=函数声明AddRow,我必须为我的jquery click函数创建一个作用域句柄,所以这非常有效!
var ProductsTable = new Table({
table: "#ProductsTable tbody",
rowTemplate: "#ProductsTable_TemplateRow",
bind: [
{
action: function() {
ProductsTable.AddRow();
},
element: "#productsAddRowButton"
}
]
});