Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用由参数在变量中声明的函数_Javascript - Fatal编程技术网

Javascript 调用由参数在变量中声明的函数

Javascript 调用由参数在变量中声明的函数,javascript,Javascript,我希望能够运行在变量“Table”中声明的函数。 原因是为了避免使用基于字符串的解析来运行函数 var Table = function( params ){ var rowTemplate = params.rowTemplate; var table = params.table; function GetRow() { return $( r

我希望能够运行在变量“Table”中声明的函数。 原因是为了避免使用基于字符串的解析来运行函数

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