如何在Javascript中调用动态命名的方法?

2022-08-30 04:27:52

我正在努力动态创建一些JavaScript,这些JavaScript将在构建时插入到网页中。

JavaScript 将用于根据另一个 .当选择一个时,它将根据所选值调用方法名称。listboxlistboxlistboxlistbox

例如:

Listbox1包含:

  • Colours
  • Shapes

如果选定 ,则它将调用填充另一个 .Colourspopulate_Colourslistbox

澄清我的问题:我如何在JavaScript中进行调用?populate_Colours


答案 1

假定该方法位于全局命名空间中,则可以使用以下代码,该代码利用以下两个条件:可以像访问对象是关联数组一样访问所有对象属性,并且所有全局对象实际上都是宿主对象的属性。populate_Colourswindow

var method_name = "Colours";
var method_prefix = "populate_";

// Call function:
window[method_prefix + method_name](arg1, arg2);

答案 2

正如 Triptych 所指出的,您可以通过在宿主对象的内容中找到任何全局作用域函数来调用它。

一个更简洁的方法,它对全局命名空间的污染要少得多,是直接将函数显式地放入数组中,如下所示:

var dyn_functions = [];
dyn_functions['populate_Colours'] = function (arg1, arg2) { 
                // function body
           };
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
                // function body
           };
// calling one of the functions
var result = dyn_functions['populate_Shapes'](1, 2);
// this works as well due to the similarity between arrays and objects
var result2 = dyn_functions.populate_Shapes(1, 2);

此数组也可能是全局宿主对象以外的某个对象的属性,这意味着您可以像许多JS库(如jQuery)一样有效地创建自己的命名空间。如果/当您在同一页面中包含多个单独的实用程序库时,这对于减少冲突非常有用,并且(设计的其他部分允许)可以更轻松地在其他页面中重用代码。

您也可以使用如下所示的对象,您可能会发现它更干净:

var dyn_functions = {};
dyn_functions.populate_Colours = function (arg1, arg2) { 
                // function body
           };
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
                // function body
           };
// calling one of the functions
var result = dyn_functions.populate_Shapes(1, 2);
// this works as well due to the similarity between arrays and objects
var result2 = dyn_functions['populate_Shapes'](1, 2);

请注意,对于数组或对象,您可以使用任何一种设置或访问函数的方法,当然也可以在其中存储其他对象。对于不是动态的内容,您可以使用JS文字表示法进一步减少任一方法的语法,如下所示:

var dyn_functions = {
           populate_Colours:function (arg1, arg2) { 
                // function body
           };
         , populate_Shapes:function (arg1, arg2) { 
                // function body
           };
};

编辑:当然,对于更大的功能块,您可以将上述内容扩展到非常常见的“模块模式”,这是一种以有组织的方式封装代码功能的流行方式。