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

Javascript:如何动态调用方法并为其动态设置参数

Javascript:如何动态调用方法并为其动态设置参数,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我正在用javascript进行测试,可以动态调用一个方法并为其动态设置参数 let obj = { method: 'foo1', params: ['one', 'two'] } foo 1(p1, p2) { // do something } 要运行它=> [obj.method](obj.params) 是否有任何方法可以从数组中动态添加参数。是-扩展ES6: window[obj.method](...obj.params); 确保正确访问函数-如果在全局范围内使用

我正在用javascript进行测试,可以动态调用一个方法并为其动态设置参数

let obj = {
  method: 'foo1',
  params: ['one', 'two']
}

foo 1(p1, p2) {
 // do something
}
要运行它=>

[obj.method](obj.params)
是否有任何方法可以从数组中动态添加参数。

是-扩展ES6:

window[obj.method](...obj.params);

确保正确访问函数-如果在全局范围内使用var声明函数,它将绑定到窗口。否则,它将无法在所有的bar eval中访问,这是一种糟糕的做法。

对于按字符串名称调用函数:

window[obj.method](...obj.params)
例如:

let obj = {
    method: 'foo1',
    params: ['one', 'two']
}

function foo1(p1, p2) {
    console.log(p1, p2)
}

window[obj.method](...obj.params) // result: one two

您需要函数作为对象的方法存在,然后可以使用括号符号[]动态调用它,并将方法名称作为字符串传递到括号中作为索引。然后将使用扩展运算符。。。将参数数组展平为分隔列表

其他人将全局窗口作为父对象显示了这一点,但正如我们所知,全局窗口通常是不好的,所以只需创建自己的窗口

下面,我展示了多种方法和参数选择,并要求用户键入他们想要的组合。当然,这种输入可以通过许多其他方式处理

//这些方法必须存储在对象中,以便可以通过 //稍后用括号表示。 设obj={ 方法1:函数foo1p1,p2{ 调用console.logmethod1时使用了:,个参数; }, 方法2:函数foo1p1,p2{ 调用console.logmethod2时使用了:,个参数; }, 参数1:['1','2'], 参数2:['三','四'], }; //获取用户所需的调用要求: let choice=prompenter'method1'或'method2'; 设args=prompenter'params1'或'params2'; //将方法名称作为字符串传递到对象中以提取 //该财产的价值。然后用调用它并查找正确的 //参数属性以相同的方式。使用 //排列运算符。。。。
obj[choice]…obj[args];您正在查找.call或.apply obj.method.callobj.method、obj.params;可能是@briosheje的副本我想你不明白这个问题。obj.method不起作用,因为它是一个字符串,您不能对字符串使用call、apply或bind。@ScottMarcus wops,您是对的,您需要通过窗口调用,除非它属于其他对象。我认为问题在于传递动态参数。