在Javascript中动态调用函数
Call function dynamically in Javascript
我想从"User.fund"这样的字符串中动态调用一个函数。如果函数存在,脚本会调用对象User中的函数find()。以下是我尝试过的:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() + method[0].substring(1);
var methodToCall = method[1];
nameObj.call(methodToCall, some_data_array);
但它总是回来:
nameObj.call(methodToCall, some_data_array);
TypeError: Object User has no method 'call'
知道吗?我不能使用window,因为这是node.js的问题,脚本没有在浏览器中执行。
您完全误解了call()
。
使用call()
可以调用具有不同this
的方法。
您想按名称获取属性:
object[methodName](arg1, arg, ...);
您实际上可以实现这一点。您首先需要获得scope
,其中定义了名称空间/函数/对象。
例如,在您的代码中,我假设它是window
。
因此,对代码进行一点修改就会产生所需的结果:
var User = {};
User.find = function(x){
alert(x);
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = global[method[0]];
var methodToCall = method[1];
nameObj[methodToCall](some_data_array.name);
标记global[]
的使用。这就是它的起点。
[edited]*修改代码,使用global
,而不是nodejs
中使用的window
。
您想要做的是访问全局对象。
这应该有效:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() +method[0].substring(1);
var methodToCall = method[1];
"use strict";
var global = (1,eval)("this");
alert(global[nameObj][methodToCall](some_data_array));
有几种方法可以获得所需的结果。在这种情况下,只需使用匿名函数非常简单,如下所示,传入objName.name:中包含的字符串参数
var f = function(oName){
if (oName == 'John Doe') {
return 1;
}
};
var objName = {name: 'John Doe'};
console.log( f( objName.name ) );
如果OP更喜欢使用对象的调用方法,那么以下代码也就足够了:
var myObj = {
myFunc: function() {
if (this.name == 'John Doe') {
return 1;
}
}
}
var objName = {
name: 'John Doe'
};
console.log(myObj.myFunc.call(objName));
有几点需要注意。myObj通过对象参数objName调用其方法myFunc()。方法中this的目的是读取属性name,由于绑定到对象objName而具有该能力。
相关文章:
- 如何从模块链中调用函数.导出到节点中
- 调用函数内部的函数
- 在javascript中调用c函数
- DropDownListFor赢得't在更改时调用函数
- Javascript页面调用函数
- 在动画结束之前调用函数
- 允许父窗口在其不同域的子iframe上调用函数
- 运行Infinite Scroll后调用函数时出现问题
- JavaScript:在调用函数的文本输入上按enter键
- 使用大括号和不使用bracs调用函数的区别
- javascript在事件上调用函数
- 从index.html调用函数,该函数无限循环
- 从带参数的字符串变量调用函数中的函数
- 为什么 JS 不在滚动时调用函数
- 是否可以在不更改上下文的情况下调用函数.apply
- 如何在ES6类中使用参数调用函数
- AngularJS:调用函数时编号不更新
- JavaScript中的立即调用函数表达式(IIFE)-传递jQuery
- 在JavaScript中调用函数时自定义此选项
- 调用函数中声明的变量