Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.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_Dynamic_Methods - Fatal编程技术网

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

如何在Javascript中调用动态命名的方法?,javascript,dynamic,methods,Javascript,Dynamic,Methods,我正在动态创建一些JavaScript,在构建网页时将其插入网页 JavaScript将用于根据另一个列表框中的选择填充列表框。当一个列表框的选择被更改时,它将根据列表框的选定值调用一个方法名称 例如: Listbox1包含: 颜色 形状 如果选择了colors,则它将调用一个populate\u colors方法来填充另一个列表框 为了澄清我的问题:如何在JavaScript中调用populate\u colors?假设populate\u colors方法位于全局命名空间中,您可以使用以

我正在动态创建一些JavaScript,在构建网页时将其插入网页

JavaScript将用于根据另一个
列表框中的选择填充
列表框
。当一个
列表框
的选择被更改时,它将根据
列表框
的选定值调用一个方法名称

例如:

Listbox1
包含:

  • 颜色
  • 形状
如果选择了
colors
,则它将调用一个
populate\u colors
方法来填充另一个
列表框


为了澄清我的问题:如何在JavaScript中调用
populate\u colors

假设
populate\u colors
方法位于全局命名空间中,您可以使用以下代码,该代码利用了这两个特性,即所有对象属性都可以像对象是关联数组一样被访问,并且所有全局对象实际上都是
窗口
宿主对象的属性

var方法\u name=“colors”;
var方法\u prefix=“填充”;
//调用函数:
窗口[方法前缀+方法名称](arg1,arg2);

正如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);
这个数组也可以是一些对象的属性,而不是全局主机对象,这意味着您可以像jQuery这样的JS库一样有效地创建自己的名称空间。如果/当您在同一页面中包含多个单独的实用程序库时,这有助于减少冲突,并且(设计的其他部分允许)可以更容易地在其他页面中重用代码

您也可以使用这样的对象,您可能会发现它更干净:

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
           };
};
编辑:当然,对于较大的功能块,您可以将上述内容扩展到非常常见的“模块模式”,这是一种以有组织的方式封装代码功能的流行方式。

您好,尝试一下

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

它将自行处理参数。

您可以这样做:

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

var myObject = new MyClass();
myObject["abc"]();
let dynamic_func_name = 'alert';
(new Function(dynamic_func_name+'()'))()
试试这个:

var fn_name = "Colours",
fn = eval("populate_"+fn_name);
fn(args1,argsN);

我建议不要为此使用
全局
/
窗口
/
eval

相反,要这样做:

将所有方法定义为处理程序的属性:

var Handler={};

Handler.application_run = function (name) {
console.log(name)
}
现在就这样说吧

var somefunc = "application_run";
Handler[somefunc]('jerry');
function runThis_func(my_Parameter){

    alert(my_Parameter +" triggerd");
}
输出:


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

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

const Handler= {
  func1,
  func2
};

Handler["func1"]("sic mundus");
Handler["func2"]("creatus est");

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

触发函数

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动态生成函数

var somefunc = "application_run";
Handler[somefunc]('jerry');
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."\");'>";

?>

维修工
维修工
内,将
窗口
替换为
自身

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

工作者无法访问DOM,因此
窗口
是无效的引用。为此,等效的全局范围标识符是
self

,我不建议像其他一些答案所建议的那样使用该窗口。使用
并相应地确定范围

this['yourDynamicFcnName'](arguments);
另一个巧妙的技巧是在不同的作用域内调用并将其用于继承。假设您嵌套了函数并希望访问全局窗口对象。您可以这样做:

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

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

let dynamic_func_name = 'alert';
let para_1 = 'HAHAHA';
let para_2 = 'ABCD';
(new Function(`${dynamic_func_name}('${para_1}','${para_2}')`))()
this.callFunction=this.call\u function=function(name){
var args=Array.prototype.slice.call(参数,1);
返回窗口[name]。调用(此,…args);
};
函数sayHello(姓名、年龄){
log('hello'+name+',您的'e age是'+age');
还一些;
}
log(调用函数('sayHello','john',30));//你好,约翰,你的年龄是30岁

试试这些

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

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

var myObject = new MyClass();
myObject["abc"]();
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))()
就这么做吧

class User

  getName() 
  {   

    return "dilo";
   }

}

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

 

谢谢你的回复。“窗口”这一点让我很吃惊,直到我用谷歌搜索它,发现全局对象是窗口对象的一部分。现在有道理了!非常感谢。仅供参考,我在这里找到了一个很好的页面,我做了一些类似的事情,只是我的目标函数位于jQuery“fn”名称空间中。例如,
$.fn[方法前缀+方法名称](arg1,arg2)不错。可能值得添加一个
try
/
catch
块。这对某些人来说可能是显而易见的,但对于那些无法让它工作的人来说:将函数抛出
$(函数(){
窗口。加载
代码:)@peter,因为在这种情况下,方括号不是属性访问器,而是表示数组。数组不是函数,所以不能调用它们。我建议不要这样做,而是在单个“填充”方法中使用本地分支。这样会使它更易测试,看起来不太“粗糙”看到我的答案了。这是一个保持干净的好方法。但是我怎么称呼这个方法呢?窗口[dyn_函数['populate_colors'](arg1,arg2)会工作吗?回答我自己的问题-我刚刚测试了窗口[dyn_函数['populate_colors'](arg1,arg2)];它确实工作。正如epascarello指出的,你通常不需要“窗口”——“dyn_函数['populate_colors'](arg1,arg2);”将起作用。事实上,如果您正在编写可能在JS环境中使用的例程,不包含全局对象的名称将使代码更易于移植