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

问题描述 投票:0回答:13

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

JavaScript 将用于根据另一个

listbox
中的选择来填充
listbox
。当更改其中一个
listbox
的选择时,它将根据
listbox
的选定值调用方法名称。

例如:

Listbox1
包含:

  • Colours
  • Shapes

如果选择了

Colours
,那么它将调用填充另一个
populate_Colours
listbox
方法。

澄清我的问题:如何在 JavaScript 中进行

populate_Colours
调用?

javascript dynamic methods
13个回答
249
投票

假设

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

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

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

53
投票

我建议 NOT 为此目的使用

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

49
投票

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

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


20
投票

你可以这样做:

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

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

6
投票

ServiceWorker
Worker
中,将
window
替换为
self

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

Workers 无权访问 DOM,因此

window
是无效引用。用于此目的的等效全局范围标识符是
self


6
投票

我不建议像其他一些答案所建议的那样使用窗口。使用

this
并相应地确定范围。

this['yourDynamicFcnName'](arguments);

另一个巧妙的技巧是在不同的范围内调用并使用它进行继承。假设您已嵌套该函数并希望访问全局窗口对象。你可以这样做:

this['yourDynamicFcnName'].call(window, arguments);

4
投票

就做吧

class User {
  getName() {   
    return "dilo";
  }
}

let user = new User();
let dynamicMethod = 'getName';
console.log(user[dynamicMethod]()); //dilo

1
投票

嗨试试这个,

 var callback_function = new Function(functionName);
 callback_function();

它将自行处理参数。


0
投票

一个简单的函数,使用参数动态调用函数:

this.callFunction = this.call_function = function(name) {
    var args = Array.prototype.slice.call(arguments, 1);
    return window[name].call(this, ...args);
};

function sayHello(name, age) {
    console.log('hello ' + name + ', your\'e age is ' + age);
    return some;
}

console.log(call_function('sayHello', 'john', 30)); // hello john, your'e age is 30


0
投票

尝试这些

使用动态名称调用函数,如下所示:

let dynamic_func_name = 'alert';
(new Function(dynamic_func_name+'()'))()

带参数:

let dynamic_func_name = 'alert';
let para_1 = 'HAHAHA';
let para_2 = 'ABCD';
(new Function(`${dynamic_func_name}('${para_1}','${para_2}')`))()

运行动态代码:

let some_code = "alert('hahaha');";
(new Function(some_code))()

0
投票

// FUNCTIONS
const funcs = {

  func1() {
    console.log('func1 accessed');
  },

  func2() {
    console.log('func2 accessed');
  }

}

// DYNAMIC FUNCTION NAME
const nameFunc = 'func2';

// DYNAMIC ACCESS TO FUNCTIONS
funcs[nameFunc]();


-2
投票

这是一个有效且简单的解决方案,用于检查 某个函数是否存在 并通过另一个函数 动态地对该函数进行分类;

触发功能

function runDynmicFunction(functionname){ if (typeof window[functionname] == "function" ) { //check availability window[functionname]("this is from the function it "); //run function and pass a parameter to it } }

你现在可以像这样使用 php 动态生成函数

function runThis_func(my_Parameter){ alert(my_Parameter +" triggerd"); }

现在您可以使用动态生成的事件调用该函数

<?php $name_frm_somware ="runThis_func"; echo "<input type='button' value='Button' onclick='runDynmicFunction(\"".$name_frm_somware."\");'>"; ?>

您需要的确切 HTML 代码是

<input type="button" value="Button" onclick="runDynmicFunction('runThis_func');">
    

-4
投票
试试这个:

var fn_name = "Colours", fn = eval("populate_"+fn_name); fn(args1,argsN);
    
© www.soinside.com 2019 - 2024. All rights reserved.