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

IT技术 javascript dynamic methods
2021-01-23 06:49:55

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

JavaScript 将用于listbox根据另一个listbox. listbox更改选择一个时,它将基于所选值调用方法名称listbox

例如:

Listbox1 包含:

  • Colours
  • Shapes

如果Colours被选中,那么它将调用一个populate_Colours填充另一个listbox.

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

6个回答

假设该populate_Colours方法在全局命名空间中,您可以使用以下代码,它利用了所有对象属性都可以像对象是关联数组一样访问,并且所有全局对象实际上都是window宿主对象的属性

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

// Call function:
window[method_prefix + method_name](arg1, arg2);
感谢您的回复。'window' 位真的让我很困惑,直到我用谷歌搜索它并发现全局对象是 window 对象的一部分。现在说得通了!谢谢你。仅供参考,我在这里找到了一个很好的页面 devlicio.us/blogs/sergio_pereira/archive/2009/02/09/...
2021-03-17 06:49:55
好的。值得添加一个try/catch块,也许。
2021-03-21 06:49:55
我做了类似的事情,除了我的目标函数在 jQuery“fn”命名空间中。例如,$.fn[method_prefix + method_name](arg1, arg2);
2021-03-24 06:49:55
这对某些人来说可能很明显,但对于那些无法使其工作的人:将函数抛出您的$(function () {window.load代码之外:)
2021-03-28 06:49:55
@peter 因为在此上下文中方括号不是属性访问器,而是表示一个数组。数组不是函数,所以你不能调用它们。
2021-04-12 06:49:55

正如 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
           };
};

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

过于复杂的答案,但确实有效。我认为对于我有一系列模式化函数并且我需要一个决策树来选择执行的场景的资源负载,这种方法执行任务可能过于复杂。尽管如此,如果我要连接我自己的类对象,这将是定义对象本身的首选方法。
2021-03-16 06:49:55
回答我自己的问题 - 我刚刚测试了 window[dyn_functions['populate_Colours'](arg1,arg2)]; 它确实有效。
2021-03-23 06:49:55
这是保持清洁的好方法。我将如何调用该方法?window[dyn_functions['populate_Colours'](arg1, arg2) 会工作吗?
2021-03-25 06:49:55
正如 epascarello 指出的那样,您通常不需要“窗口”-“dyn_functions['populate_Colours'](arg1,arg2);” 将工作。事实上,如果您编写的例程可能会在 JS 环境而不是 Web 浏览器中使用,那么不包含全局对象的名称将使代码更具可移植性。但是有一个例外:如果您在函数中有一个名为 dyn_functions 的局部变量,那么您需要更具体地指代您所指的对象,但无论如何最好避免这种情况(通过采用合理的命名约定)。
2021-04-01 06:49:55
由于这篇文章来自 09 年,您现在可能已经知道这一点,但是您正在创建一个数组,然后分配给该数组的属性(而不是索引)。你也可以这样做,var dyn_functions = {};这样你就不会不必要地创建一个数组……虽然这不是一个大问题。
2021-04-08 06:49:55

我会建议不要使用global/ window/eval用于此目的。
相反,这样做:

将所有方法定义为 Handler 的属性:

var Handler={};

Handler.application_run = function (name) {
console.log(name)
}

现在这样称呼

var somefunc = "application_run";
Handler[somefunc]('jerry');

输出:杰瑞


从不同文件导入函数的情况

import { func1, func2 } from "../utility";

const Handler= {
  func1,
  func2
};

Handler["func1"]("sic mundus");
Handler["func2"]("creatus est");
为什么不使用global/ window/ eval
2021-03-20 06:49:55

你可以这样做:

function MyClass() {
    this.abc = function() {
        alert("abc");
    }
}

var myObject = new MyClass();
myObject["abc"]();

ServiceWorkeror 中Worker,替换windowself

self[method_prefix + method_name](arg1, arg2);

Worker 无权访问 DOM,因此window是无效引用。用于此目的的等效全局范围标识符是self